【问题标题】:SwiftUI - How do I create Global @State Variables?SwiftUI - 如何创建全局 @State 变量?
【发布时间】:2019-07-16 20:08:47
【问题描述】:

是否可以在 SwiftUI 中创建一个可以跨多个 Swift UI 文件访问的全局 @State 变量?

我查看了@EnvironmentObject 变量,但似乎无法让它们做我想让它们做的事情。

【问题讨论】:

  • 没有像全局@State 变量这样的东西。 EnvironmentObject 是要走的路。我建议您检查 SwiftUI 中的 WWDC 会话数据流。那里解释得很好。
  • 顺便说一句,如果您在制作 EnvironmentObject 时遇到问题,请使用一些代码更新您的答案并解释您想要实现的目标。然后人们将能够提供帮助。
  • 感谢您的评论。我将参考 WWDC 会议。

标签: swiftui


【解决方案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 }))
}
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 2019-11-10
    • 1970-01-01
    • 2016-10-25
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多