我有一个简单的类来在我的 SwiftUI 应用程序中存储一些数据:
final class UserData: ObservableObject {
@Published var id = 1
@Published var name = "Name"
@Published var description = "Initial text"
}
我还在主应用程序结构中将其定义为 EnvironmentObject
:
ContentView(document: file.$document)
.environmentObject(UserData())
在我的内容视图中,我嵌入了一个 UIKit 文本视图:
EditorTextView(document: $document.text)
其中 EditorTextView 是通过 UITextView
应用的 UIViewRepresentable
。
现在,我要做的是更新 EditorTextView 中的 UserData,例如,将一些用户输入存储到 UserData.description
中。所以我在我的 Coordinator 中定义了这个类如下(代码只是举例):
class Coordinator: NSObject, UITextViewDelegate {
@ObservedObject var userData = UserData()
...
// Somewhere in the code, I update UserData when user taps Enter:
func textViewDidChange(_ textView: UITextView) {
if (textView.text.last == "\n") {
userData.description = "My New Text"
}
}
我的问题是:
尽管使用“我的新文本”更新(如调试器所示),userData.description
的值再次使用“初始文本”值重新初始化。就像每次都创建 UserData 类一样。
我尝试使用@StateObject 而不是@ObservedObject,但没有任何区别。
答案 0 :(得分:3)
“就像每次都创建 UserData 类一样。”
它每次都在这里创建:
class Coordinator: NSObject, UITextViewDelegate {
@ObservedObject var userData = UserData() // <--- here
试试这个,然后从外部传入 UserData:
class Coordinator: NSObject, UITextViewDelegate {
@ObservedObject var userData: UserData
通常,您也会在主应用程序结构中执行此操作:
@StateObject var userData = UserData()
...
ContentView(document: file.$document).environmentObject(userData)