如何在SwiftUI观察的变量值改变时立即触发动作

4

我在我的视图中有一个列表(List),当列表参数改变时,其中的元素(element)将会被更新。以下是我的视图代码:

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,因此列表内容会在Model中更改时自动更新。

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

查看中的用户列表


在编程中,如果您的视图必须反映某个最终状态,请在您的模型中公开该状态属性!SwiftUI 是一个表示层。 - user3441734
2个回答

6
假设 listaUtenti 是@Published属性,您可以如下捕获其发布者
List(self.users.listaUtenti, id: \.self) { user in
    Text(user)
}
.onReceive(self.users.$listaUtenti) { newValue in
     // do this what's needed
}

是否存在一种willReceive()函数,可以在已发布变量将要更改之前捕获已发布的值? - Giuseppe Roberto Rossi
有点晚了,但供参考。是的,您必须使用newValue,因为它包含更新后的更改。不要在块中或从块调用的任何函数中使用self.users.$listaUtenti,因为它还没有包含更改。 - Brett

0
class Utenti : ObservableObject {

    @Published var listaUtenti = ["anna", "smith", "david"]  {
         didSet {
             // your func here
         }
    }
}

在上述代码中,每当listaUtenti元素发生变化时,您的函数将被执行。

谢谢,但在我的情况下,我需要监视视图中已更改的变量而不是模型中的变量。我该怎么做? - Giuseppe Roberto Rossi
@GiuseppeRobertoRossi 嗯,我认为每当模型更改时,视图都会刷新。因此...视图可以检测到模型。您是否添加了一个属性,该属性是模型值的获取属性? - koreaMacGuy
我进行了上述调整,因为ObservableObject仅适用于类,而不是结构体。 - James Toomey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接