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 变量的设置值

c++多个文件中如何共用一个全局变量

如何根据 SwiftUI 中的 @State 更改导航视图的导航视图样式?

SwiftUI:如何在函数计算 @State 值时同时更新视图?

如何在 SwiftUI 中使用 UIButton 更改 @State var

如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?