我有一个 ForEach 循环,显示十个未填充的按钮。当按钮被点击时,按钮将被点击按钮的索引分配给@State变量;仅当状态变量的值等于单击按钮的索引时,按钮才会被填充。我应该更改什么才能 1) 单击同一个按钮来取消填充按钮,2) 填充另一个按钮而不“取消填充”任何已填充的按钮?
这是一个最小的、可重现的示例:
import SwiftUI
struct Test: View {
@State var selection: Int? = nil
var body: some View {
VStack {
ForEach (0 ..< 10, id: \.self) { number in
Button (action: {
self.selection = number
}, label: {
self.selection == number ? Image(systemName: "heart.fill") : Image(systemName: "heart")
})
}
}
}
}
struct Test_Previews: PreviewProvider {
static var previews: some View {
Test()
}
}
提前致谢。
最佳答案
您需要一个选择属性来跟踪多个按钮,而不仅仅是一个按钮。我会在这里使用 Set
(不是 Array
,因为那里没有方便的 remove
-object 方法)
struct Test: View {
@State var selection = Set<Int>() /// will contain the indices of all selected buttons
var body: some View {
VStack {
ForEach (0 ..< 10, id: \.self) { number in
Button(action: {
if selection.contains(number) {
selection.remove(number)
} else {
selection.insert(number)
}
}) {
selection.contains(number) ? Image(systemName: "heart.fill") : Image(systemName: "heart")
}
}
}
}
}
关于SwiftUI - ForEach 同时切换多个按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67687897/