当StateRealmObject属性变更时,如何刷新SwiftUI视图?
解决SwiftUI中@StateRealmObject属性修改后视图不刷新的问题
问题核心:使用@StateRealmObject展示Realm对象时,替换整个对象视图能正常刷新,但直接修改对象属性(如name)时视图无响应,无需手动强制刷新,只需调整修改属性的方式。
最优解决方案
问题出在你调用了thaw()来修改属性,这绕开了@StateRealmObject的监听机制。直接修改@StateRealmObject包装的对象属性即可触发视图更新,无需手动解冻。
修改「更新名称」按钮的代码:
Button("Update name", action: { try! realm.write() { country.name = country.name + "_ADD" } })
原因说明
@StateRealmObject会自动管理对象的冻结状态,并监听对象的属性变化。当你调用thaw()时,获取到的是Realm数据库中的原始对象实例,而非@StateRealmObject包装的可观察实例,因此修改这个原始对象的属性无法触发SwiftUI的视图刷新。直接修改包装后的对象属性,Realm与SwiftUI的绑定机制会自动捕获变化并重新渲染视图。
修改后的完整代码
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] // 视图正常刷新 }) Text(country.name).padding() Button("Update name", action: { try! realm.write() { country.name = country.name + "_ADD" // 现在会触发视图刷新 } }) } } .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")) } } } }
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

