我有一个ScrollView,其中包含一个VStacks按钮数组。 VStack数据是从名为ProductModel
的数据模型填充的。我还从另一个视图通过ObservableObject
,这里是:(注意:此数据字符串确实发生了变化,因此并不总是All
。也是ProductModel之一ScrollView中将始终匹配要匹配的数据)。
class selectedApplication: ObservableObject {
@Published var selectedApplication = "All"
}
我想要做的是将所有与传递的数据字符串不匹配的行涂成灰色,并仅将匹配的VStack涂成彩色。之后,如果按下了其他按钮,则该VStack变为彩色,其他所有按钮变为/保持灰色。我尝试通过@State
并使用切换键来更改饱和度,但是没有运气。因此,关于如何解决此问题的任何方向将不胜感激!谢谢
这是VStack的视图:
struct ProductTab5View: View {
@ObservedObject var application: selectedApplication
@State private var selection: Bool? = true
var product: ProductModel
var body: some View {
ScrollView(.horizontal){
HStack
ForEach(product.application, id: \.self) { item in
Button(action: {
application.selectedApplication = item
selection = false
}) {
VStack{
Image(item)
Text(item)
}
.saturation(selection ?? true ? 0.0 : 1.0)
}
}
}
}
}
答案 0 :(得分:2)
不需要额外的@State
变量。您可以尝试以下操作:
struct ProductTab5View: View {
@ObservedObject var application: selectedApplication
var product: ProductModel
var body: some View {
ScrollView(.horizontal) {
HStack
ForEach(product.application, id: \.self) { item in
Button(action: {
application.selectedApplication = item
}) {
VStack {
Image(item)
Text(item)
}
.saturation(application.selectedApplication == item ? 1.0 : 0.1)
}
}
}
}
}