我的视图上显示了一个@StateRealmObject。
当整个对象发生更改时,视图会更新(如“更改国家/地区”按钮上所做的那样),但是当我仅更改该对象的属性时,不会渲染视图(“更改名称”按钮)!!!
我希望文本能够在国家/地区对象已修改时呈现。
实现这一目标的最佳方法是什么?
(我可以使用 id 和新的状态变量手动强制更新文本,但这是一个糟糕的解决方案,因为它在大视图中会变得很麻烦,应该有一个更优雅和最先进的解决方案)。
感谢您的建议,这是完整的功能代码:
import SwiftUI
import RealmSwift
let realm = try! Realm()
class Country2: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var code = ""
@Persisted var name = ""
convenience init(_ code: String, _ name: String) {
self.init()
self.code = code
self.name = name
}
}
struct ContentView2: View {
@StateRealmObject var country: Country2
var body: some View {
ZStack {
VStack {
Button("Change country", action: {
let randomIndex = Int.random(in: 0..<realm.objects(Country2.self).count)
country = realm.objects(Country2.self)[randomIndex]. // Render OK
})
Text(country.name).padding()
Button("Update name", action: {
try! realm.write() {
country.thaw()!.name = country.name + "_ADD" // No render
}
})
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.background(Color.lightGrey)
.onAppear() {
try! realm.write() {
realm.deleteAll()
realm.add(Country2("AO","Angola"))
realm.add(Country2("AR","Argentina"))
realm.add(Country2("AT","Austria"))
realm.add(Country2("AU","Australia"))
}
}
}
}
我想你对使用 SwiftUI 的 Realm 并不熟悉。您只需复制 Realm 的 UIKit 体验,然后在 Realm 上查找 SwiftUI 的内容即可。
首先阅读本文并重构您的代码。
https://www.mongodb.com/docs/realm/sdk/swift/swiftui-tutorial/
或者简短版本
https://zhaoxin.pro/16285779845842.html
简单来说,你应该使用
@ObservedResults(Country2.self) var countries
而不是
@StateRealmObject var country: Country2