You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:13:11