如何在 SwiftUI 中关闭工作表时刷新视图

uma*_*nga 6 swiftui

我想TextField从一个视图中获取用户输入(使用)并在另一个视图中显示它(用户输入的文本)。

这是一个最小的、可重现的示例

我创建了一个ObservableObject名为UserData

import Foundation
import  SwiftUI
import Combine

class UserData: ObservableObject {
    @Published var name: String = ""
}
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个名为视图EditTextField在那里用户可以输入文本

import SwiftUI

struct Edit: View {

    @ObservedObject var userData = UserData()

    var body: some View {
        VStack {
            TextField("Enter Name", text: $userData.name)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我们单击 中的按钮时,将显示ContentView一个带有Edit视图的工作表

当我单击该按钮时,会Edit显示一个带有视图的工作表?。
然后我可以使用TextField?输入文本。
但是当我通过向下拖动关闭工作表时,TextinContentView仍然是空的。

据我所知,$userData.name每当我在TextField.

但是Text在另一个视图中带有绑定self.userData.name不会反映更新后的值。 当我们关闭工作表时,


有什么方法可以更新,Text或者有没有其他方法可以做到这一点?

请帮我。

感谢您阅读我的问题

小智 6

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

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

@ObservedObject var userData: UserData
Run Code Online (Sandbox Code Playgroud)

然后,在您的 中ContentView,将对您的单个规范对象的引用传递UserDataEdit视图中:

.sheet(isPresented: $isPresented) {
    Edit(userData: self.userData)
}
Run Code Online (Sandbox Code Playgroud)