类和可观察对象

时间:2020-03-04 18:13:35

标签: swiftui

我正在尝试制作一个可以由不同视图引用的数据模型类。数据模型具有可以修改其已发布变量之一的功能。但是,此函数在一个视图内部被调用,它对已发布变量所做的更改不会反映在也引用该类的其他视图中。我能想到的最简单的例子是:

struct ContentView: View {
    var body: some View {
        VStack {
            TextView()
            ButtonView()
        }
    }
}

struct TextView: View {

    @ObservedObject var data = Data()

    var body: some View {
        Text(data.currentWord)
    }
}

struct ButtonView: View {

    @ObservedObject var data = Data()

    var body: some View {
        Button(action: {self.data.randomWord()}) {
            Text("Random word")
        }
    }
}

class Data: ObservableObject {

    @Published var currentWord = "Cat"

    func randomWord() {
        let word = ["Cat", "Dog", "Mouse", "Horse"].randomElement()!
        print(word)
        currentWord = word

    }

}

ButtonView和TextView都引用相同的类,并且ButtonView调用“ Data”类的方法“ randomWord”,该方法修改了其“ currentWord”发布的变量。但是,对该变量所做的更改未反映在TextView的Text中,该TextView也引用了“ Data”类。

我认为我对类和observableObject的理解不正确。有人会在这里指出我的错误吗?

1 个答案:

答案 0 :(得分:1)

您在子视图中创建了两个不同的Data实例,而您需要共享一个实例,因此请在defect = data[data['DEFECT'] == 'CRACK'] defect_chart = defect['Month'].value_counts(ascending=True).sort_index() fig, ax = plt.subplots() mean = len(defect) / products ax2 = ax.twinx() ax2.plot(mean) ax2.set_ylabel('Defects/Total Products', color='b') ax.set(xlabel='Month', ylabel='Sum of Defects') defect_chart.plot(kind='bar', ax=ax, title='Defects') 中创建它,并按如下所示传递给子视图

ContentView

作为变体,对于这种情况,也可以使用struct ContentView: View { @ObservedObject var data = Data() var body: some View { VStack { TextView(data: data) ButtonView(data: data) } } } struct TextView: View { @ObservedObject var data: Data var body: some View { Text(data.currentWord) } } struct ButtonView: View { @ObservedObject var data: Data var body: some View { Button(action: {self.data.randomWord()}) { Text("Random word") } } } 模式。因此,这里有很多示例,您可以找到有关环境对象用法的信息-只需按关键字搜索即可。