ios - 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)
推荐阅读
- python - 在 pygame.sprite.groupcollide() 中有效地使用 pygame.sprite.collide_mask()
- javascript - (0, _reactNativeRedash.onScroll) 不是函数
- python - 在理解中重用表达式
- javascript - 如何从反应组件的地图功能中选择DOM元素?
- internationalization - AWS Amplify I18n - 如何获取当前设置的语言?
- json - 貘, Circe, Snakecase
- javascript - 在 ACF 日期选择器中禁用日期和星期几
- java - Firebase + RxJava,onComplete() 事件
- amazon-web-services - Kubernetes 禁止:用户“system:anonymous”无法获取路径“/”
- python - 无法用folium绘制地图