将 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
) 时显示警报或操作表,但我不确定什么是解决此问题的好方法。
我的模型层由值类型struct
s 组成,因此目前无法选择将属性标记为@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
绑定只是一个占位符。由于servicePlayer
以nil
开头,因此我们的想法是在最初显示警报,但在网球比赛后期,当发球者再次为nil
且尚未被选中时,也会再次出现。
【问题讨论】:
最好能显示一些最少的代码 @NewDev 我刚刚添加了代码的相关部分,谢谢。 【参考方案1】:你可能明白,.alert
的isPresented
参数需要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 中隐藏/显示警报?