You need to enable JavaScript to run this app. SwiftUI实现需确认的编辑详情视图sheet时赋值失效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI实现需确认的编辑详情视图sheet时赋值失效问题求助

问题根源

你遇到的赋值不生效问题不是Xcode Beta版本的bug,是两处逻辑错误导致的:

    1. 你通过自定义下标$modelStore[modelSelection]获取的Binding不合法:ModelStore是ObservableObject类型,其本身的projectedValue并不支持直接通过下标返回数组元素的Binding,所以你拿到的modelBinding本身无法正确写入数据到models数组。
    1. 你允许修改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:

  1. 先修改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)
    }
  1. 修改Done按钮的点击逻辑:
Button {
    model = editingModel
    modelSelection = editingModel.id // 同步更新选中id为新值
    isEditing = false
} label: {
    Text("Done")
}
  1. 修改DetailView中弹出sheet的代码,传入参数:
.sheet(isPresented: $isEditing) {
    DetailEditView(model: modelBinding, isEditing: $isEditing, modelSelection: $modelSelection)
}

修改完成后运行即可正常保存修改内容。

内容的提问来源于stack exchange,提问作者appfrosch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:03:03