【发布时间】:2020-02-06 19:45:29
【问题描述】:
我正在尝试使用 SwiftUI 和 MVVM 架构构建应用程序。我想让我的 View 在它的 ViewModel 认为有必要时显示一个警报——比如,当它有一个来自 Model 的某种新结果时。因此,假设每当 VM 检测到新结果时,它都会相应地设置其 status:
ViewModel:
enum Status {
case idle
case computing
case newResultAvailable
}
class MyViewModel: ObservableObject {
@Published var status = Status.idle
...
}
观点:
struct ContentView: View {
@ObservedObject var vm = MyViewModel()
@State private var announcingResult = false {
didSet {
// reset VM status when alert is dismissed
if announcingResult == false {
vm.status = .idle
}
}
}
var body: some View {
Text("Hello")
.alert(isPresented: $announcingResult) {
Alert(title: Text("There's a new result!"),
message: nil,
dismissButton: .default(Text("OK")))
}
}
}
Apple 设计了 .alert() 修饰符以将绑定作为其第一个参数,以便在绑定属性变为 true 时显示警报。然后,当警报解除时,绑定属性会自动设置为false。
我的问题是:
每当 VM 的 status 变为 .newResultAvailable 时,如何让警报出现?在我看来,这就是正确的 MVVM 应该如何发挥作用,并且感觉非常符合所有 SwiftUI WWDC 演示的精神,但我找不到方法……
【问题讨论】:
-
是否有任何文档参考或解释说明为什么这不起作用?我似乎无法理解这背后的原因。
-
@Rikh 只要将
announcingResult设置为true,它就可以工作。但我的目标是在vm.status变为某个值时发出警报……而上面的代码没有任何规定可以做到这一点。这就是为什么@asperi 在下面的回答是必要的。 -
啊,我看错了你上面的例子。道歉。我发现在视图模型中直接使用
@Published值来控制警报也不会导致它出现在View中。所以一直在寻找答案!
标签: ios swift mvvm swiftui alert