SwiftUI-如何创建全局@State变量?

时间:2019-07-16 20:08:47

标签: swiftui

是否可以在SwiftUI中创建一个全局@State变量,可以在多个Swift UI文件之间进行访问?

我已经研究了@EnvironmentObject变量,但似乎无法使它们执行我希望它们执行的操作。

1 个答案:

答案 0 :(得分: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 }))
}
...