如何在 SwiftUI 中关闭 sheet 时刷新视图
How to refresh a view on dismiss of a sheet in SwiftUI
我想从一个视图中获取用户输入(使用 TextField
)并在另一个视图中显示它(用户输入的文本)。
这是一个最小的、可重现的例子
我创建了一个名为 UserData
的 ObservableObject
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
中的按钮时,sheet 会显示 Edit
视图
当我单击该按钮时,会显示 sheet 和 Edit
视图 ✅。
然后我可以使用 TextField
✅ 输入文本。
但是当我通过向下拖动关闭 sheet 时, ContentView
中的 Text
仍然是空的。
据我所知,每当我在 TextField
.
中输入内容时,$userData.name
都会更新
但是在另一个视图中具有绑定 self.userData.name
的 Text
不会反映更新后的值。
当我们关闭 sheet 时,有什么方法可以更新 Text
还是有其他方法可以做到这一点?
请帮助我。
感谢阅读我的问题
您的 Edit
视图和 ContentView
各自持有不同的 UserData
对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。
首先更新您的 Edit
视图,使其 不 初始化它自己的 UserData
对象:
@ObservedObject var userData: UserData
然后,在您的 ContentView
中,将 reference 传递给您的单个规范 UserData
对象到 Edit
视图中:
.sheet(isPresented: $isPresented) {
Edit(userData: self.userData)
}
我想从一个视图中获取用户输入(使用 TextField
)并在另一个视图中显示它(用户输入的文本)。
这是一个最小的、可重现的例子
我创建了一个名为 UserData
ObservableObject
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
中的按钮时,sheet 会显示 Edit
视图
当我单击该按钮时,会显示 sheet 和 Edit
视图 ✅。
然后我可以使用 TextField
✅ 输入文本。
但是当我通过向下拖动关闭 sheet 时, ContentView
中的 Text
仍然是空的。
据我所知,每当我在 TextField
.
中输入内容时,$userData.name
都会更新
但是在另一个视图中具有绑定 self.userData.name
的 Text
不会反映更新后的值。
当我们关闭 sheet 时,有什么方法可以更新 Text
还是有其他方法可以做到这一点?
请帮助我。
感谢阅读我的问题
您的 Edit
视图和 ContentView
各自持有不同的 UserData
对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。
首先更新您的 Edit
视图,使其 不 初始化它自己的 UserData
对象:
@ObservedObject var userData: UserData
然后,在您的 ContentView
中,将 reference 传递给您的单个规范 UserData
对象到 Edit
视图中:
.sheet(isPresented: $isPresented) {
Edit(userData: self.userData)
}