如何在SwiftUI中的Sheet关闭后刷新视图

7

我希望在一个视图中获取用户输入(使用 TextField),并在另一个视图中展示用户输入的文本内容。

以下是一个最小可复现的示例:

我创建了一个名为UserDataObservableObject

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视图的表单 ✅。
然后我可以使用TextField输入文本 ✅。
但是,当我通过向下拖动来关闭表单时,ContentView中的Text仍然为空。

据我所知,每当我在TextField中输入内容时,$userData.name都会更新。

但是另一个具有绑定值self.userData.name 的视图中的Text不会反映更新后的值。


是否有办法在关闭表单时更新Text,或者还有其他方法可以做到这一点?

请帮帮我。

谢谢阅读我的问题


三件事情。 (1) 你的代码一开始看起来不错 - 假设你正在使用 @State,而不是 @ObservableObject。但是 (2) 为什么你没有使用 @EnvironmentObject?我有可用的代码。最后,(3) 我现在对于你在这里的 name 变量的未接受答案已经有了6个赞:https://dev59.com/XbXna4cB1Zd3GeqPP7xP#57513103 有可能这会对你有所帮助吗? - user7014451
1个回答

7
你的Edit视图和ContentView分别持有独立的UserData对象。它们没有共享指向同一对象的引用,因此编辑其中之一不会更新另一个。
首先,更新你的Edit视图,使其不初始化自己的UserData对象:
@ObservedObject var userData: UserData

然后,在您的ContentView中,将对您的唯一规范UserData对象的引用传递到Edit视图中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接