?
1. 發生問題的demo
?
業務邏輯代碼?
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修改的代碼
?業務邏輯代碼?
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