[SwiftUI 开发] 嵌套的ObservedObject中的更改不会更新UI

1. 发生问题的demo

业务逻辑代码

Swift 复制代码
class Address: ObservableObject {
    @Published var street = "123 Apple Street"
    @Published var city = "Cupertino"
}

class User: ObservableObject {
    @Published var name = "Tim Cook"
    @Published var address = Address()
}

struct ContentView: View {
    @ObservedObject var user = User()

    var body: some View {
        VStack {
            Text("Name: \(user.name)")
            Text("Address: \(user.address.street), \(user.address.city)")
            Button("Change Address") {
                user.address.street = "New York"
            }
        }
    }
}

当我有一个嵌套的ObservedObject时,嵌套对象的已发布属性的更改不会更新UI,直到父对象发生变化,才会刷新。

2. 修改后的代码

SwiftUI(更准确地说是Combine)只能看到值的变化,因此,它可以看到@Published结构实例的属性值的变化,而不能看到@Published类。

如果您希望基于这些嵌套对象的属性值的更改来更新Ul,则使用嵌套对象的结构实例。如果必须使用类实例,请使用另一种机制显式地通知更改。下面是使用struct代替class的NestedObject修改的代码

业务逻辑代码

Swift 复制代码
struct Address {
    var street = "123 Apple Street"
    var city = "Cupertino"
}

class User: ObservableObject {
    @Published var name = "Tim Cook"
    @Published var address = Address()
}

struct ContentView: View {
    @ObservedObject var user = User()

    var body: some View {
        VStack {
            Text("Name: \(user.name)")
            Text("Address: \(user.address.street), \(user.address.city)")
            Button("Change Address") {
                user.address.street = "New York"
            }
        }
    }
}

总结一句话,一个对象只需要当前属性@Published就可以了,子类使用struct

相关推荐
大熊猫侯佩12 天前
消失的它:摆脱 SwiftUI 中“嵌入视图数量不能超过 10 个”限制的秘密
swiftui·swift·apple
东坡肘子12 天前
失去时才会觉得可贵 | 肘子的 Swift 周报 #090
swiftui·swift·apple
大熊猫侯佩13 天前
SwiftUI 中创建一个自定义文件管理器只需4步!你敢信!?
swiftui·swift·apple
大熊猫侯佩14 天前
SwiftUI 趣谈之:绝不可能(Never)的 View!
swiftui·swift·apple
大熊猫侯佩15 天前
SwiftUI 更自然地向自定义视图传递参数的“另类”方式
swiftui·swift·apple
大熊猫侯佩16 天前
SwiftUI 集合视图(Grid)拖放交换 Cell 的极简实现
swiftui·swift·apple
大熊猫侯佩17 天前
SwiftUI 中无法对添加模糊(blur)效果视图截图的初步解决
swiftui·swift·apple
大熊猫侯佩18 天前
Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得
swiftui·swift·apple
东坡肘子19 天前
WWDC 2025:回归务实的一年 | 肘子的 Swift 周报 #089
swiftui·swift·wwdc