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

hud*_*son 6 swiftui

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

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

ars*_*ius 7

从 Beta 3 开始,您无法创建顶级全局@State变量。编译器会出现段错误。您可以将一个放在结构中并创建该结构的实例以进行构建。但是,如果您实际实例化它,您将收到一个运行时错误,例如:Accessing State<Bool> outside View.body

可能您正在寻找的是一种简单的方法来创建到BindableObject. 在这个 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 }))
}
...
Run Code Online (Sandbox Code Playgroud)