有没有办法在 SwiftUI 中“解除绑定”变量/对象

问题描述 投票:0回答:2

我能做的最好的比较是所有手机都附带的 iPhone 通讯录应用程序。

当用户启动应用程序时,它会列出所有联系人。用户可以选择联系人,然后显示该联系人的“详细信息视图”。最后,用户可以选择编辑联系人并转到“编辑详细信息视图”。简单...

我的应用程序中的功能之一是完全相同的。

  1. 我向用户呈现一个列表,用户可以单击列表中的任何项目。

  2. 单击该项目后,他们可以在“详细信息视图”上查看该项目的详细信息。

  3. 用户能够“编辑”项目,现在他们可以通过“编辑详细信息视图”中的文本字段输入对项目的修改。

  4. 用户现在可以根据需要“保存”或“取消”他们的修改/编辑,这会将他们导航回“详细信息视图”。

再次简单,就像通讯录应用程序一样。

所以问题是:“保存”工作完美,因为我将对象作为绑定变量传递:

@Binding var cigar: Cigar

更改文本字段时,用户按“保存”后,修改将反映在“详细信息视图”中,这是所需的结果。

问题在于,即使用户单击“取消”,文本字段中的更改仍然是引用-取消引用“已保存”,这不是期望的结果。我想这是因为我使用的是

@Binding
变量并且该变量实时变化。

所以我的问题是,当用户单击“取消”或想要放弃他们所做的更改/编辑时,是否有任何方法可以“取消绑定”或放弃对

@Binding
变量/对象所做的更改?

请帮忙,或者您是否可以提出更好的方法来实现结果。

ios data-binding swiftui
2个回答
2
投票

绑定是对事实来源的直接引用,因此进行编辑时可以直接修改原始数据,因此在取消时设置unbound,即应用after更改,即使有可能也没有任何意义(但它是不是)。

只要您有有状态编辑(即通过“保存”操作来应用),您就需要这些数据的显式本地存储。

这是一种可能的方法(伪代码)

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
     }
  }
}

0
投票

您会对 init() 的调用频率感到惊讶。取消或撤消对绑定的更改不是 SwiftUI 的一个组成部分,这是一个主要问题。

© www.soinside.com 2019 - 2024. All rights reserved.