如何在 SwiftUI 中关闭工作表时刷新视图
Posted
技术标签:
【中文标题】如何在 SwiftUI 中关闭工作表时刷新视图【英文标题】:How to refresh a view on dismiss of a sheet in SwiftUI 【发布时间】:2019-09-05 15:38:49 【问题描述】:我想从一个视图获取用户输入(使用TextField
)并在另一个视图中显示它(用户输入的文本)。
这是一个最小的、可重现的例子
我创建了一个名为 UserData
的 ObservableObject
import Foundation
import SwiftUI
import Combine
class UserData: ObservableObject
@Published var name: String = ""
然后我用TextField
创建了一个名为Edit
的视图,用户可以在其中输入文本
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
就会更新。
但是另一个视图中的Text
绑定self.userData.name
不会反映更新的值????。
当我们关闭工作表时,有什么方法可以更新Text
,还是有其他方法可以做到这一点?
请帮帮我。
感谢您阅读我的问题????
【问题讨论】:
三件事。 (1) 乍一看,您的代码看起来不错——前提是您使用的是@State
,而不是@ObservableObject
。但是 (2) 为什么你不使用@EnvironmentObject
?我有这方面的工作代码。最后,(3)我现在有 6 票赞成我对您的 name
变量的未接受答案:***.com/questions/57511826/… 这可能对您有帮助吗?
【参考方案1】:
您的Edit
视图和ContentView
分别持有单独的UserData
对象。它们不共享对单个对象的引用,因此编辑其中一个不会更新另一个。
首先更新您的Edit
视图,使其不初始化自己的UserData
对象:
@ObservedObject var userData: UserData
然后,在您的 ContentView
中,将 reference 传递给您的单个规范 UserData
对象到 Edit
视图中:
.sheet(isPresented: $isPresented)
Edit(userData: self.userData)
【讨论】:
以上是关于如何在 SwiftUI 中关闭工作表时刷新视图的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:在 macOS NavigationView 中关闭视图
使用 SwiftUI 时尝试在视图中显示工作表时应用程序崩溃