SwiftUI实现需确认的编辑详情视图sheet时赋值失效问题求助
问题根源
你遇到的赋值不生效问题不是Xcode Beta版本的bug,是两处逻辑错误导致的:
- 你通过自定义下标
$modelStore[modelSelection]获取的Binding不合法:ModelStore是ObservableObject类型,其本身的projectedValue并不支持直接通过下标返回数组元素的Binding,所以你拿到的modelBinding本身无法正确写入数据到models数组。
- 你通过自定义下标
- 你允许修改
Model的id属性,但当前选中的标识modelSelection存的是修改前的旧id,就算保存成功,后续界面也会因为找不到旧id的元素,展示兜底的第一项,看起来像保存失败。
- 你允许修改
修复方案
第一步:修正Binding获取逻辑
把DetailView中的modelBinding改为直接从@Published的models数组中取绑定:
var modelBinding: Binding<Model> { guard let selectId = modelSelection, let index = modelStore.models.firstIndex(where: { $0.id == selectId }) else { return $modelStore.models[0] } return $modelStore.models[index] }
第二步:保存后更新选中id
给DetailEditView新增modelSelection绑定参数,保存时同步更新为新的id:
- 先修改
DetailEditView的定义:
struct DetailEditView: View { @Binding var model: Model @Binding var isEditing: Bool @Binding var modelSelection: Model.ID? // 新增选中id绑定 @State private var editingModel: Model // 初始化方法同步新增参数 init(model: Binding<Model>, isEditing: Binding<Bool>, modelSelection: Binding<Model.ID?>) { self._model = model self._isEditing = isEditing self._modelSelection = modelSelection self._editingModel = State(initialValue: model.wrappedValue) }
- 修改Done按钮的点击逻辑:
Button { model = editingModel modelSelection = editingModel.id // 同步更新选中id为新值 isEditing = false } label: { Text("Done") }
- 修改
DetailView中弹出sheet的代码,传入参数:
.sheet(isPresented: $isEditing) { DetailEditView(model: modelBinding, isEditing: $isEditing, modelSelection: $modelSelection) }
修改完成后运行即可正常保存修改内容。
内容的提问来源于stack exchange,提问作者appfrosch
相关产品推荐
相关产品推荐

