首页 > 解决方案 > 在视图之间传递变量 SwiftUI

问题描述

再次提出基本问题:我想让变量“ anytext ”对我要添加的所有未来视图可见和可访问。在我的情况下,变量将是一个String

  1. 如果它是Float程序会改变吗?
  2. 如何将其保存为全局变量?
  3. 如果我重新启动应用程序,变量是否会自行删除?以及如何保存即使在重新启动应用程序后仍会保留的变量?

    import SwiftUI
    
    struct Entry: View {
        
        @State var anytext: String = ""
        
        var body: some View {
            
            VStack {
                
                TextField("Enter text here", text: $anytext)
                    .padding()
                    .border(Color.black, width: 1)
                    .padding()
            }
            
        }
    }
    
    struct Entry_Previews: PreviewProvider {
        static var previews: some View {
            Entry()
        }
    }

标签: variablesswiftuistateglobal

解决方案


在应用程序的根视图或任何“子”视图可能需要访问anytext. anytext作为@Published属性存储在ObservedObject.

这是一个指针,但会有很多类似的问题和东西。这是一篇可能会有所帮助的HWS 文章。

这是一个例子:

class MyModel: ObservableObject {
    @Published var anytext = ""
}
struct ContentView: View {
    @StateObject private var model = MyModel()

    var body: some View {
        Entry().environmentObject(model)
    }
}

struct Entry: View {
    @EnvironmentObject private var model: MyModel

    var body: some View {
        VStack {
            TextField("Enter text here", text: $model.anytext)
                .padding()
                .border(Color.black, width: 1)
                .padding()

            TextDisplayer()
        }
    }
}

struct TextDisplayer: View {
    @EnvironmentObject private var model: MyModel

    var body: some View {
        Text(model.anytext)
    }
}

结果:

结果

model他们可以访问所有三个视图以获取anytext属性。

要回答您的问题:

  1. 您使用@Published因为String,FloatDouble都是值类型。

  2. 使用环境对象,如此处所示。

  3. 它们不会被持久化,请参阅@AppStorage保存。


推荐阅读