ios 在SwiftUI中有没有一种方法可以“解除绑定”变量/对象

r7s23pms  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(113)

我能做的最好的比较是所有手机都附带的iPhone联系人应用程序。
当用户启动应用程序时,它会列出所有联系人。用户可以选择一个联系人,并显示该联系人的“详细信息视图”。最后,用户可以选择编辑联系人并转到“编辑详细信息视图”。简单...
我的应用程序中的一个功能是完全相同的。
1.我向用户呈现一个列表,用户可以单击列表中的任何项目。
1.一旦他们点击项目,他们可以查看该项目的详细信息在“详细视图”。
1.用户有能力“编辑”的项目,现在他们可以输入修改项目通过文本字段中的“编辑详细信息视图”。
1.用户现在可以“保存”或“取消”他们的修改/编辑,如果他们想,这将导航他们回到“详细视图”。
就像联系人应用程序一样简单。
所以问题是:“保存”的工作是简单的,因为我将Object作为绑定变量传递:
@Binding var cigar: Cigar
当文本字段被更改时,在用户按下“保存”后,修改将在“详细信息视图”中反映更改,这是所需的结果。
问题是,即使用户点击“取消”,文本字段中的更改仍然是“保存”的,这不是期望的结果。我想这是因为我使用了一个@Binding变量,变量是实时变化的。
所以我的问题是,当用户点击“取消”或想要放弃他们所做的更改/编辑时,有没有办法“解除绑定”或放弃对@Binding变量/对象所做的更改?
能不能请一些帮助,或者如果你能建议一个更好的方法来实现的结果。

2w3rbyxf

2w3rbyxf1#

绑定是直接引用真理的来源,所以编辑你直接修改原始数据,所以取消 unbound,即 * 在 * 更改已应用后,即使它是可能的也没有意义(但事实并非如此)。
只要你有 * 状态 * 编辑(即应用事实的保存行动),你需要明确的本地存储这些数据。
下面是一个可能的方法(伪代码)

struct SomeView: View {

   @Binding var cigar: Cigar

   @State private var editingCigar: Cigar

   init(cigar: Binding<Cigar>) {
      self._cigar = cigar
      self._editingCigar = State(initialValue: cigar.wrappedValue)
   }

   var body: some View {

     // ... work here with `editingCigar`

     Button("Save") { 
        // !! Copy back edited cigar explicitly
        self.cigar = editingCigar
     }

     Button("Cancel") {
        // just close w/o touching self.cigar
     }
  }
}

相关问题