【发布时间】:2022-01-08 17:03:59
【问题描述】:
我知道有人已经问过类似的问题,但我仍然没有解决问题。
我有一个带有 2 个按钮的 HStack,点击后会更改图像。在单击另一个按钮之前,第一个按钮不会在单击时更改,第二个按钮会正确更新。两个按钮的区别在于第一个按钮的动作取决于变量“museum.favorite”,该变量是博物馆类的变量。第二个更新取决于变量 b 的值,这是在同一视图中声明的状态变量。
过去几天我一直坚持这一点,如果有人知道背后的原因和解决方法,我将不胜感激。我希望按钮根据“museum.favorite”的值更新的原因是因为我发现如果我根据在同一视图中声明的状态变量进行更新(将变量作为参数传递也不起作用),那么在我切换到另一个视图后,图像很快又变回了默认值(“heart”而不是“heart.fill”)。
这是代码,提前谢谢!:
var museum:Museum
@State var a = false
@State var b = false
var body: some View {
HStack {
Button {
museum.favorite.toggle()
} label: {
Image(systemName: museum.favorite == true ? "heart.fill" : "heart")
}
Button {
b.toggle()
} label: {
Image(systemName: b == true ? "star.fill" : "star")
}
}
}
}
struct Test_Previews: PreviewProvider {
static var previews: some View {
let model = MuseumModel()
Test(museum: model.museums[0])
}
}
【问题讨论】:
-
如果博物馆是一个类,就像你说的那样,它需要是一个 ObservableObject 并且收藏夹需要是一个 @Published 属性。
-
我已经尝试过了,但是将@Published 添加到收藏夹会得到错误:“类型'Museum'不符合协议'Decodable'”。类博物馆被声明为 --> 类博物馆:可识别、可解码、可观察对象 {}。我该如何解决这个问题?
-
欢迎来到 Stack Overflow!请拨打tour 并查看:How do I ask a good question? 和How to create a Minimal, Reproducible Example。这是一个需要一个最小的、可重现的例子的经典例子。