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

Posted

技术标签:

【中文标题】将 SwiftUI 警报或操作表绑定到值类型模型属性的可选性(当属性为 nil 时显示视图)的好方法是啥?【英文标题】:What is a good way to bind a SwiftUI alert or action sheet to the optionality of a value type model property (show the view when the property is nil)?将 SwiftUI 警报或操作表绑定到值类型模型属性的可选性(当属性为 nil 时显示视图)的好方法是什么? 【发布时间】:2021-01-28 23:50:06 【问题描述】:

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

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

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
            )

$isPresented 绑定只是一个占位符。由于servicePlayernil 开头,因此我们的想法是在最初显示警报,但在网球比赛后期,当发球者再次为nil 且尚未被选中时,也会再次出现。

【问题讨论】:

最好能显示一些最少的代码 @NewDev 我刚刚添加了代码的相关部分,谢谢。 【参考方案1】:

你可能明白,.alertisPresented 参数需要Binding<Bool>

我假设 Match 在您看来是 @State 属性:

struct ContentView: View 
   @State var match: Match

   var body: some View  ... 

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

.alert(isPresented: .constant(match.servicePlayer == nil)) 
   Alert(...)

因为Alert 将通过更改match 来修改状态。

【讨论】:

以上是关于将 SwiftUI 警报或操作表绑定到值类型模型属性的可选性(当属性为 nil 时显示视图)的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?

如何使用 SwiftUI 呈现警报

在 swiftui 不工作的警报后显示确认警报

如何绑定 SwiftUI 和 UIViewController 行为

SwiftUI 中的可选状态或绑定

SwiftUI:以编程方式关闭警报