将 SwiftUI 警报或操作表绑定到值类型模型属性的可选性(当属性为零时显示视图)的好方法是什么?

Aus*_*lon 5 ios swift swiftui

SwiftUI 警报和操作表采用布尔绑定,但我希望我的警报和操作表在模型属性为 时显示nil。模型属性是var servicePlayer: Player!,我希望在尚未选择网球发球运动员时显示警报或操作表 ( nil),但我不确定什么是解决此问题的好方法。

我的模型层由值类型组成struct,因此目前将属性标记为@Published不是一个选项。class将我的整个模型层重构为能够采用组合的引用类型听起来并不值得(我依赖于模型实例作为值类型副本来撤消和重做),但我可能是错的。

struct Match: Codable {
    ...
    var servicePlayer: Player!
    ...
}

.alert(isPresented: $isPresented) {
    Alert(title: Text("Who will serve?"),
              primaryButton: .default(Text("You")) {
                match.servicePlayer = .playerOne
            },
              secondaryButton: .default(Text("Opponent")) {
                match.servicePlayer = .playerTwo
            })
}
Run Code Online (Sandbox Code Playgroud)

绑定$isPresented只是一个占位符。从servicePlayer一开始nil,我们的想法是首先显示警报,但稍后在网球比赛中再次出现发球手nil但尚未选择时再次出现。

New*_*Dev 8

正如您可能理解的,isPresented的参数.alert需要一个Binding<Bool>.

我认为Match这是@State您认为的财产:

struct ContentView: View {
   @State var match: Match

   var body: some View { ... }
}
Run Code Online (Sandbox Code Playgroud)

这意味着当情况发生变化时,视图将重新计算。这意味着您可以使用您的特定情况Binding.constant(bool)

.alert(isPresented: .constant(match.servicePlayer == nil)) {
   Alert(...)
}
Run Code Online (Sandbox Code Playgroud)

因为Alert会通过改变 来修改状态match