如何在 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.nameText 不会反映更新后的值。


当我们关闭 sheet 时,有什么方法可以更新 Text 还是有其他方法可以做到这一点?

请帮助我。

感谢阅读我的问题

您的 Edit 视图和 ContentView 各自持有不同的 UserData 对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。

首先更新您的 Edit 视图,使其 初始化它自己的 UserData 对象:

@ObservedObject var userData: UserData

然后,在您的 ContentView 中,将 reference 传递给您的单个规范 UserData 对象到 Edit 视图中:

.sheet(isPresented: $isPresented) {
    Edit(userData: self.userData)
}