SwiftUI ObservedObject 每次都会重新启动

问题描述

我有一个简单的类来在我的 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,但没有任何区别。

解决方法

“就像每次都创建 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...