我正在尝试使用 SwiftUI 和 MVVM 架构构建一个应用程序。我希望我的视图在其 ViewModel 认为有必要时(例如,当它从模型中获得某种新结果时)显示警报。因此,假设每当虚拟机检测到新结果时,它就会设置其status
因此:
视图模型:
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")))
}
}
}
苹果公司设计了.alert()
修饰符将绑定作为其第一个参数,以便每当绑定属性变为true
。然后,当警报解除时,绑定属性会自动设置为false
.
我的问题是:如何让虚拟机每次运行时都出现警报status
变成.newResultAvailable
?在我看来,这就是 MVVM 应该发挥的作用,而且感觉非常符合所有 SwiftUI WWDC 演示的精神,但我找不到方法......
这是可能的方法(经过测试并适用于 Xcode 11.3+)
struct ContentView: View {
@ObservedObject var vm = MyViewModel()
var body: some View {
let announcingResult = Binding<Bool>(
get: { self.vm.status == .newResultAvailable },
set: { _ in self.vm.status = .idle }
)
return Text("Hello")
.alert(isPresented: announcingResult) {
Alert(title: Text("There's a new result!"),
message: nil,
dismissButton: .default(Text("OK")))
}
}
}
有时也可以使用以下符号
var body: some View {
Text("Hello")
.alert(isPresented: Binding<Bool>(
get: { self.vm.status == .newResultAvailable },
set: { _ in self.vm.status = .idle }
)) {
Alert(title: Text("There's a new result!"),
message: nil,
dismissButton: .default(Text("OK")))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)