当值通过单独的方法更改时,SwiftUI@State不会触发更新



我有一段(简单的(SwiftUI显示代码:

struct ContentView: View {
private var errorMessage: String?
@State private var showErrors: Bool = false
var errorAlert: Alert {
Alert(title: Text("Error!"), 
message: Text(errorMessage ?? "oops!"), 
dismissButton: .default(Text("Ok")))
}
init() {}
var body: some View {
VStack {
Text("Hello, World!")
Button(action: {
self.showErrors.toggle()
}) {
Text("Do it!")
}
}
.alert(isPresented: $showErrors) { errorAlert }
}
mutating func display(errors: [String]) {
errorMessage = errors.joined(separator: "n")
showErrors.toggle()
}
}

当显示视图并用胶带粘上"Do it!"按钮时,警报将按预期显示。

但是,如果我调用display(errors:...)函数,则会设置错误消息,但显示器不会发出警报。

我猜这与按钮在视图内,功能在视图外有关,但我不知道如何修复它。考虑到任何应用程序需要更新这样的显示的功能量,这应该很容易。

好的,更多的阅读和重构切换到使用这样的可观察视图模型:

class ContentViewModel: ObservableObject {
var message: String? = nil {
didSet {
displayMessage = message != nil
}
}
@Published var displayMessage: Bool = false
}
struct ContentView: View {
@ObservedObject private var viewModel: ContentViewModel
var errorAlert: Alert {
Alert(title: Text("Error!"), message: Text(viewModel.message ?? "oops!"), dismissButton: .default(Text("Ok")))
}
init(viewModel: ContentViewModel) {
self.viewModel = viewModel
}
var body: some View {
VStack {
Button(action: {
self.viewModel.displayMessage.toggle()
}) {
Text("Do it!")
}
}
.alert(isPresented: $viewModel.displayMessage) { errorAlert }
}
}

它现在正在按预期工作。因此,从中得出的结论是,即使在像这样简单的代码中,使用可观察的视图模型也更有用。

最新更新