@Published property wrapper not working on subclass of ObservableObject
Finally figured out a solution/workaround to this issue. If you remove the property wrapper from the subclass, and call the baseclass objectWillChange.send() on the variable the state is updated properly.
NOTE: Do not redeclare let objectWillChange = PassthroughSubject<Void, Never>()
on the subclass as that will again cause the state not to update properly.
I hope this is something that will be fixed in future releases as the objectWillChange.send()
is a lot of boilerplate to maintain.
Here is a fully working example:
import SwiftUI class MyTestObject: ObservableObject { @Published var aString: String = "" } class MyInheritedObject: MyTestObject { // Using @Published doesn't work on a subclass // @Published var anotherString: String = "" // If you add the following to the subclass updating the state also doesn't work properly // let objectWillChange = PassthroughSubject<Void, Never>() // But if you update the value you want to maintain state // of using the objectWillChange.send() method provided by the // baseclass the state gets updated properly... Jaayy! var anotherString: String = "" { willSet { self.objectWillChange.send() } } } struct MyTestView: View { @ObservedObject var myTestObject = MyTestObject() @ObservedObject var myInheritedObject = MyInheritedObject() var body: some View { NavigationView { VStack(alignment: .leading) { TextField("Update aString", text: self.$myTestObject.aString) Text("Value of aString is: \(self.myTestObject.aString)") TextField("Update anotherString", text: self.$myInheritedObject.anotherString) Text("Value of anotherString is: \(self.myInheritedObject.anotherString)") } } } }
iOS 14.5 resolves this issue.
Combine
Resolved Issues
Using Published in a subclass of a type conforming to ObservableObject now correctly publishes changes. (71816443)
This is because ObservableObject is a protocol, so your subclass must conform to the protocol, not your parent class
Example:
class MyTestObject { @Published var aString: String = ""}final class MyInheritedObject: MyTestObject, ObservableObject { @Published var anotherString: String = ""}
Now, @Published properties for both class and subclass will trigger view events