我正在尝试制作一个可以由不同视图引用的数据模型类。数据模型具有可以修改其已发布变量之一的功能。但是,此函数在一个视图内部被调用,它对已发布变量所做的更改不会反映在也引用该类的其他视图中。我能想到的最简单的例子是:
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的理解不正确。有人会在这里指出我的错误吗?
答案 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")
}
}
}
模式。因此,这里有很多示例,您可以找到有关环境对象用法的信息-只需按关键字搜索即可。