在视图之间传递变量 SwiftUI
Passing Variables between Views SwiftUI
再问基本问题:
我想让变量“anytext”对我将要添加的所有未来视图可见和可访问。在我的例子中,变量将是 String.
- 如果它是 Float,程序会改变吗?
- 如何将其保存为全局变量?
- 如果我重新启动应用程序,变量会自行删除吗?以及如何保存即使在重新启动应用程序后仍将保留的变量?
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()
}
}
在应用的根视图或任何 'children' 视图可能需要访问 anytext
的地方创建并传入环境对象。将 anytext
作为 @Published
属性 存储在 ObservedObject
.
中
这是一个指针,但会有很多类似的问题和内容。这里有一个 HWS article 可能会有所帮助。
这是一个例子:
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
属性。
回答您的问题:
你用@Published
是因为String
、Float
、Double
等都是值类型
使用环境对象,如此处所示。
它们不会持久化,请参阅 @AppStorage
以保存它。
再问基本问题: 我想让变量“anytext”对我将要添加的所有未来视图可见和可访问。在我的例子中,变量将是 String.
- 如果它是 Float,程序会改变吗?
- 如何将其保存为全局变量?
- 如果我重新启动应用程序,变量会自行删除吗?以及如何保存即使在重新启动应用程序后仍将保留的变量?
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()
}
}
在应用的根视图或任何 'children' 视图可能需要访问 anytext
的地方创建并传入环境对象。将 anytext
作为 @Published
属性 存储在 ObservedObject
.
这是一个指针,但会有很多类似的问题和内容。这里有一个 HWS article 可能会有所帮助。
这是一个例子:
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
属性。
回答您的问题:
你用
@Published
是因为String
、Float
、Double
等都是值类型使用环境对象,如此处所示。
它们不会持久化,请参阅
@AppStorage
以保存它。