交互动作:打开EditView编辑页面
完成后,我们回到ContentView主页中,我们来实现页面跳转的逻辑。首先我们先声明一个用于页面跳转的参数,如下代码所示:
@State var showEditView: Bool = false
然后在CardView视图中增加页面跳转的方法,这里也可以使用Sheet修饰符,如下代码所示:
// 打开编辑弹窗 .sheet(isPresented: self.$showEditView, onDismiss: {self.showEditView = false }) { EditView(model: self.item ?? Model(platformIcon: "", title: "", platformName: "", indexURL: "")) }
上述代码中,我们使用sheet修饰符用户打开模态弹窗,触发操作绑定声明好的变量showEditView,打开的模态弹窗的页面为EditView编辑页面。
由于EditView编辑页面需要传入参数,这里我们选择传入的对应model的参数为声明的item,当item不存在时,则默认传入一个符合Model格式的数据,避免报错。
对于编辑操作,我们可以给CardView增加多一个指示符,告知用户这个卡片是可以被编辑的,如下代码所示:
Image(systemName: "ellipsis") .padding() .foregroundColor(.black) .gesture( TapGesture() .onEnded({ self.showEditView.toggle() }) )
上述代码中,我们增加了一个Image图片到CardView视图中,当点击这个Image图片时,打开EditView编辑页面。
考虑到在ContentView我们已经使用NavigationLink顶部导航菜单进行跳转,那么如果我们给按钮增加点击事件,会存在两个点击事件冲突的情况。
我们先注释掉NavigationLink相关的代码,如下图所示:
完成后,我们点击刚刚创建的编辑按钮,预览下效果,如下图所示:
新增功能:编辑并更新内容
完成样式后,我们来实现下编辑更新的逻辑,来到ViewModel视图模型中,我们创建一个编辑并更新的方法,如下图所示:
// 编辑更新数据项 func editItem(item: Model) { if let id = models.firstIndex(where: { $0.id == item.id }) { models[id] = item } }
编辑操作很简单,首先要找到点击编辑的数据项的ID在整个models数据集中的位置,更新后将更新内容赋予当前的ID,便实现了编辑更新操作。
回到EditView视图中,先引入ViewModel视图模型,如下代码所示:
var viewModel: ViewModel
然后在EditView视图预览时,给声明的viewModel赋予默认值,如下代码所示:
EditView(model: Model(platformIcon: "", title: "", platformName: "", indexURL: ""), viewModel: ViewModel())
由于我们在EditView视图声明了变量viewModel,因此在使用EditView视图的页面也要进行参数绑定。
我们来到ContentView文件,在CardView视图中,需要补充viewModel相关的参数,如下图所示:
绑定完成后,我们再回到EditView视图,在点击updateBtn更新按钮时,调用ViewModel视图模型中的editItem方法,如下代码所示:
self.viewModel.editItem(item: model)
如此,我们便实现了编辑更新的方法。