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

SwiftUI中@Published对象的嵌套属性修改后未触发更新如何修复?

问题根因

@Published 仅会对标记属性的值变更发出通知。你这里的MyModel是class(引用类型),修改它的内部属性buttonSelection时,model属性本身的引用地址没有发生变化,所以@Published不会触发更新通知,视图自然不会刷新。

解决方案

方案1:将MyModel改为结构体(最推荐)

struct是值类型,内部属性变更时整个实例的值会发生变化,@Published可以正常捕获到变更:

struct MyModel { // 从final class改成struct
    var buttonSelection: ButtonSelection?
}

方案2:MyModel也遵循ObservableObject,手动转发变更通知

如果你的业务场景必须用class实现MyModel,可以让MyModel也遵守ObservableObject,在Controller层监听它的变更事件并转发:

import Combine

final class MyModel: ObservableObject {
    @Published var buttonSelection: ButtonSelection?
}

final class MyModelController: ObservableObject {
    @Published var model = MyModel()
    private var cancellables = Set<AnyCancellable>()

    init() {
        // 转发model的变更通知到当前Controller的objectWillChange
        model.objectWillChange
            .sink { [weak self] _ in
                self?.objectWillChange.send()
            }
            .store(in: &cancellables)
    }
}

方案3:修改属性前手动触发更新通知

如果只是临时场景需要修改,不想改动现有结构,可以在修改model属性前手动调用通知发送方法:

myModelController.objectWillChange.send()
myModelController.model.buttonSelection = .left

这个方案缺点是容易遗漏调用,不适合频繁修改的场景。

内容的提问来源于stack exchange,提问作者Tometoyou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:24:02