【问题标题】:How to trigger an action as soon as a SwiftUI observed variable changes its value如何在 SwiftUI 观察到的变量更改其值后立即触发操作
【发布时间】:2020-02-02 12:15:07
【问题描述】:

我的视图中有一个列表,一旦列表参数发生变化,它的元素就会被更新。这是我的观点:

struct ContentView: View {
@ObservedObject var users = Utenti()
@State private var isSharePresented: Bool = false

var body: some View {
    VStack(spacing: 20) {
        HStack(alignment: .center) {
            Spacer()
            Text("Internal Testers")
                .font(.title)
                .foregroundColor(.primary)
            Spacer()
            Button(action: {
                self.isSharePresented.toggle()
            }) {
                Image(systemName: "square.and.arrow.up").font(.title).padding(.trailing)
            }.sheet(isPresented: self.$isSharePresented, onDismiss: {
                print("Dismissed")
            }, content: {
                ActivityViewController(activityItems: self.users.listaUtenti)
            })
        }
        List(self.users.listaUtenti, id: \.self) { user in
            Text(user)
        }
    }
}

}

变量 users 是一个@ObservedObject,因此列表内容在模型中发生更改时会自动更新。

我的问题是:如何捕捉与 users 变量有关的“更新”事件?捕获后如何触发动作(例如调用函数)?

【问题讨论】:

  • 在您的模型中执行此操作!如果您的视图必须反映一些最终状态...通过模型的属性公开状态。 SwiftUI 是一个表示层

标签: swiftui observedobject


【解决方案1】:

假设 listaUtenti@Published 属性,您可以按如下方式捕获其发布者

List(self.users.listaUtenti, id: \.self) { user in
    Text(user)
}
.onReceive(self.users.$listaUtenti) { newValue in
     // do this what's needed
}

【讨论】:

  • 是否存在一种 willReceive() 在已发布变量发生变化之前捕获已发布值的方法?
  • 有点晚了,仅供参考。是的,您必须使用 newValue,因为它包含更新的更改。不要在块中或从块中调用的任何函数中使用 self.users.$listaUtenti,因为它尚未包含更改。
【解决方案2】:
class Utenti : ObservableObject {

    @Published var listaUtenti = ["anna", "smith", "david"]  {
       didSet {

                // your func here

         }
}

}

以上代码,每当 listaUtenti 元素发生变化时,你的 func 就会执行。

【讨论】:

  • 谢谢,但是在我的情况下,我需要在视图而不是模型中监视更改的变量。我怎么能这样做?
  • @GiuseppeRobertoRossi 嗯,我认为每当模型更改时,视图刷新。因此......视图可以检测模型。你添加属性是获取模型值的属性。
  • 我调整了上面的因为 ObservableObject 只适用于类,而不适用于结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多