[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

相关推荐
大熊猫侯佩20 小时前
星际穿越:SwiftUI 如何让 ForEach 遍历异构数据(Heterogeneous)集合
swiftui·swift·遍历·foreach·any·异构集合·heterogeneous
符哥200820 小时前
对比ArkTsUI和Flutter和 SwiftUI 和Jetpack Compose四个框架语法及使用场景。
flutter·ios·swiftui
大熊猫侯佩2 天前
越狱沙盒:SwiftUI fileImporter 的“数据偷渡”指南
swiftui·url·沙箱·sandbox·readfile·file importer·uniformtype
大熊猫侯佩7 天前
拯救巴别塔:WWDC24 全新 Translation API 实战
swiftui·wwdc·language·coreml·translation api·翻译接口·translationsess
初级代码游戏7 天前
iOS开发 SwiftUI 8:NavigationView 导航
ios·swiftui·swift
QWQ___qwq10 天前
1-s2.0-S0031320324008811-讲解
swiftui
Swift社区14 天前
使用 MetricKit 监控应用性能
ios·swiftui·swift
快手技术14 天前
KwaiDesign:为快手多元业务打造统一、高效的设计与开发体系
swiftui·arkui·weui
初级代码游戏14 天前
iOS开发 SwiftUI 6 :List
ios·swiftui·swift
东坡肘子16 天前
AT 的人生未必比 MT 更好 -- 肘子的 Swift 周报 #118
人工智能·swiftui·swift