SwiftUI - 如何创建全局 @State 变量?
Posted
技术标签:
【中文标题】SwiftUI - 如何创建全局 @State 变量?【英文标题】:SwiftUI - How do I create Global @State Variables? 【发布时间】:2019-07-16 20:08:47 【问题描述】:是否可以在 SwiftUI 中创建一个可以跨多个 Swift UI 文件访问的全局 @State 变量?
我查看了@EnvironmentObject 变量,但似乎无法让它们做我想让它们做的事情。
【问题讨论】:
没有像全局@State 变量这样的东西。 EnvironmentObject 是要走的路。我建议您检查 SwiftUI 中的 WWDC 会话数据流。那里解释得很好。 顺便说一句,如果您在制作 EnvironmentObject 时遇到问题,请使用一些代码更新您的答案并解释您想要实现的目标。然后人们将能够提供帮助。 感谢您的评论。我将参考 WWDC 会议。 【参考方案1】:从 Beta 3 开始,您无法创建***全局 @State
变量。编译器会出现段错误。您可以将一个放在结构中并创建该结构的实例以进行构建。但是,如果您实际实例化它,您将收到运行时错误,例如:Accessing State<Bool> outside View.body
。
您可能正在寻找一种简单的方法来创建与BindableObject
上的属性的绑定。 this gist 中有一个很好的例子。
可以为全局变量创建Binding
,但不幸的是,这仍然不能满足您的要求。该值将更新,但您的视图不会刷新(下面的代码示例)。
以编程方式创建Binding
的示例:
var globalBool: Bool = false
didSet
// This will get called
NSLog("Did Set" + globalBool.description)
struct GlobalUser : View
@Binding var bool: Bool
var body: some View
VStack
Text("State: \(self.bool.description)") // This will never update
Button("Toggle") self.bool.toggle()
...
static var previews: some View
GlobalUser(bool: Binding<Bool>(getValue: globalBool , setValue: globalBool = $0 ))
...
【讨论】:
以上是关于SwiftUI - 如何创建全局 @State 变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 SwiftUI 中的 @State 更改导航视图的导航视图样式?
SwiftUI:如何在函数计算 @State 值时同时更新视图?