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
相关产品推荐
相关产品推荐

