Обновление представления не запускается, когда ObservableObject наследуется в SwiftUI - PullRequest
1 голос
/ 16 марта 2020

ContentView2 представление не обновляется при изменении model.value, если Model соответствует ObservableObject напрямую вместо наследования SuperModel, тогда оно отлично работает

class SuperModel: ObservableObject {

}

class Model: SuperModel {
    @Published var value = ""
}

struct ContentView2: View {

    @ObservedObject var model = Model()

    var body: some View {
        VStack {
            Text(model.value)
            Button("change value") {
                self.model.value = "\(Int.random(in: 1...10))"
            }
        }

    }
}

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Используйте ObjectWillChange для решения указанной проблемы.

Вот рабочий код:

import SwiftUI

class SuperModel: ObservableObject {

}

class Model: SuperModel {
    var value: String = "" {
        willSet { self.objectWillChange.send() }
    }
}

struct ContentView: View {

    @ObservedObject var model = Model()

    var body: some View {
        VStack {
            Text("Model Value1: \(model.value)")
            Button("change value") {
                self.model.value = "\(Int.random(in: 1...10))"
            }
            Text("Model Value2: \(model.value)")
        }
    }
}
0 голосов
/ 16 марта 2020

Вот рабочий вариант вашего примера. Убедитесь, что для работы требуется не только связывание издателей, но и хотя бы одно опубликованное свойство. Так или иначе, это может помочь в некотором сценарии.

import SwiftUI

class SuperModel: ObservableObject {
    // this is workaround but not real trouble.
    // without any value in supermodel there is no real usage of SuperModel at all
    @Published var superFlag = false
}

class Model: SuperModel {
    @Published var value = ""
    override init() {
        super.init()
        _ = self.objectWillChange.append(super.objectWillChange)
    }
}

struct ContentView: View {

    @ObservedObject var model = Model()

    var body: some View {
        VStack {
            Text(model.value)
            Button("change value") {
                self.model.value = "\(Int.random(in: 1...10))"
            }
        }

    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

изменив код на

var body: some View {
        VStack {
            Text(model.value)
            Button("change value") {
                self.model.value = "\(Int.random(in: 1...10))"
            }
            Text(model.superFlag.description)
            Button("change super flag") {
                self.model.superFlag.toggle()
            }
        }

    }

, вы можете увидеть, как использовать даже вашу супермодель одновременно

enter image description here

0 голосов
/ 16 марта 2020

Это действительно похоже на тяжелый дефект.

class SuperModel: ObservableObject {
}

class Model: SuperModel {
    @Published var value = ""
}

, как я вижу, value изменяется и сохраняет новый, как и ожидалось, но функция DynamicProperty не работает

Следующий вариант работает для я (Xcode 11.2 / iOS 13.2)

class SuperModel: ObservableObject {
    @Published private var stub = "" // << required !!!
}

class Model: SuperModel {
    @Published var value = "" {
        willSet { self.objectWillChange.send() } // < works only if above
    }
}

Также возможен такой случай для рассмотрения:

class SuperModel {
}

class Model: SuperModel, ObservableObject {
    @Published var value = ""
}
...