在SwiftUI中继承ObservableObject时不会触发视图刷新

Sor*_*ica 5 ios swift swiftui combine

ContentView2model.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))"
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*734 6

这是您示例的工作变体。看到为了能够工作,不仅需要链接发布者,而且至少需要一个 Published 属性。左右,它可以在某些情况下有所帮助。

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

将代码更改为

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

    }
Run Code Online (Sandbox Code Playgroud)

你可以同时看到如何使用你的超模

在此处输入图片说明