@Published property wrapper not working on subclass of ObservableObject

前端 未结 4 2022
攒了一身酷
攒了一身酷 2020-12-08 02:52

I have a class conforming to the @ObservableObject protocol and created a subclass from it with it\'s own variable with the @Published property wrapper to manage state.

4条回答
  •  甜味超标
    2020-12-08 03:22

    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() 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()
    
            // 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)")
                    }
                }
            }
        }
    

提交回复
热议问题