我想从一个视图中获取用户输入(使用TextField
,并在另一视图中显示它(用户输入的文本)。
这是一个最小的,可重复的示例
我创建了一个名为ObservableObject
的{{1}}
UserData
然后我用import Foundation
import SwiftUI
import Combine
class UserData: ObservableObject {
@Published var name: String = ""
}
创建了一个名为Edit
的视图,用户可以在其中输入文本
TextField
这是import SwiftUI
struct Edit: View {
@ObservedObject var userData = UserData()
var body: some View {
VStack {
TextField("Enter Name", text: $userData.name)
}
}
}
的根视图,我要在其中显示用户输入的文本(最初,该文本为空)。
ContentView
当我们点击import SwiftUI
struct ContentView: View {
@State var isPresented = false
@ObservedObject var userData = UserData()
var body: some View {
VStack {
Text(self.userData.name)
.font(.largeTitle)
Button(action: { self.isPresented.toggle() }) {
Text("Click me to Edit")
}
.sheet(isPresented: $isPresented) {
Edit()
}
}
}
}
中的按钮时,会以ContentView
视图显示工作表
当我单击该按钮时,将显示具有Edit
视图的工作表。
然后,我可以使用Edit
enter输入文本。
但是,当我通过向下拖动来关闭工作表时,TextField
中的Text
仍为空?。
据我所知,只要我在ContentView
中输入内容,$userData.name
就会更新。
但是在另一个具有绑定TextField
的视图中的Text
不会反映更新后的值?。
解雇工作表时,有什么方法可以更新self.userData.name
还是有其他方法可以做到这一点?
请帮帮我。
感谢您阅读我的问题?
答案 0 :(得分:2)
您的Edit
视图和ContentView
分别持有单独的UserData
对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。
首先更新您的Edit
视图,以使其不初始化自己的UserData
对象:
@ObservedObject var userData: UserData
然后,在您的ContentView
中,将引用传递给您的单个规范UserData
对象进入Edit
视图:
.sheet(isPresented: $isPresented) {
Edit(userData: self.userData)
}