SwiftUI - ForEach 同时切换多个按钮

标签 swift xcode swiftui

我有一个 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/

相关文章:

ios - 如何连接 UITableVC 中制作的按钮以在 Story Board 中显示单独的 View

ios - 如何根据确认对话框防止SegmentedControl索引更改?

xcode - 使用多个引号格式化字符串时出现问题

xcode - 设置大型 Xcode 项目

swift - 转换为 Swift 3 语法时出现错误 "Optional type"

ios - SceneKit – 在 SwiftUI 中渲染时相机看不到模型

ios - 扩展自定义 TableviewCell 无法正常工作并显示不正确的 View

ios - SwiftUI TabbedView 只显示第一个选项卡的内容

swift - 如何使用Swinject注册符合ObservableObject的协议(protocol)?

macos - 如何让 SwiftUI List/OutlineGroup 懒惰地用于像文件系统这样的大树?