如何在SwiftUI中通过按更改每个按钮自己的背景颜色来制作每个按钮?

如何在SwiftUI中通过按更改每个按钮自己的背景颜色来制作每个按钮?,swiftui,Swiftui,我想让每个按钮在我点击时改变颜色,再次点击时再改变颜色。所以我做了一个布尔didTap,根据它的值,它应该改变它的背景 此时的代码会改变每个按钮的背景。正如我从其他帖子中了解到的,这个按钮系统工作得并不完美 怎么办?如何得到我需要的结果?我应该用别的东西(不是按钮)吗?我应该使用像这样的didTapB1之类的东西吗?(如果使用它,似乎代码会很长?) 您需要向每个按钮添加didTap。只需创建自定义视图即可: struct BingoButton: View { var text: St

我想让每个按钮在我点击时改变颜色,再次点击时再改变颜色。所以我做了一个布尔didTap,根据它的值,它应该改变它的背景

此时的代码会改变每个按钮的背景。正如我从其他帖子中了解到的,这个按钮系统工作得并不完美

怎么办?如何得到我需要的结果?我应该用别的东西(不是按钮)吗?我应该使用像这样的didTapB1之类的东西吗?(如果使用它,似乎代码会很长?)


您需要向每个按钮添加
didTap
。只需创建自定义视图即可:

struct BingoButton: View {
    var text: String
    @State private var didTap = false

    var body: some View {
        Button(action: {
            self.didTap.toggle()
        }) {
            Text(text)
            .padding()
            .background(didTap ? Color.red : Color.black)
                .clipShape(Circle())
        }
    }
}
然后您可以将实现更改为以下内容:

        VStack {
            Text("I")
                ForEach(numI, id: \.self) { tekst in
                   BingoButton(text: tekst)
                }
            }
        }


可以考虑更改模型并使UI定义更小和不重复:

struct BingoRow: Identifiable {
    let id = UUID()
    let headline: String
    let numbers: [String]
}

struct SimpleView: View {
    var rows = [
        BingoRow(headline: "B", numbers: ["5","9","11","15","9"]),
        BingoRow(headline: "I", numbers: ["16","19","21","25","22"]),
        BingoRow(headline: "N", numbers: ["35","39","41","45","42"]),
        BingoRow(headline: "G", numbers: ["55","59","61","57","52"]),
        BingoRow(headline: "O", numbers: ["66","69","71","75","72"])
    ]

    var body: some View {
        HStack {
            ForEach(rows) { row in
                VStack {
                    Text(row.headline)
                    ForEach(row.numbers, id: \.self) { text in
                        BingoButton(text: text)
                    }
                }
            }
        }
    }
}

您需要向每个按钮添加
didTap
。只需创建自定义视图即可:

struct BingoButton: View {
    var text: String
    @State private var didTap = false

    var body: some View {
        Button(action: {
            self.didTap.toggle()
        }) {
            Text(text)
            .padding()
            .background(didTap ? Color.red : Color.black)
                .clipShape(Circle())
        }
    }
}
然后您可以将实现更改为以下内容:

        VStack {
            Text("I")
                ForEach(numI, id: \.self) { tekst in
                   BingoButton(text: tekst)
                }
            }
        }


可以考虑更改模型并使UI定义更小和不重复:

struct BingoRow: Identifiable {
    let id = UUID()
    let headline: String
    let numbers: [String]
}

struct SimpleView: View {
    var rows = [
        BingoRow(headline: "B", numbers: ["5","9","11","15","9"]),
        BingoRow(headline: "I", numbers: ["16","19","21","25","22"]),
        BingoRow(headline: "N", numbers: ["35","39","41","45","42"]),
        BingoRow(headline: "G", numbers: ["55","59","61","57","52"]),
        BingoRow(headline: "O", numbers: ["66","69","71","75","72"])
    ]

    var body: some View {
        HStack {
            ForEach(rows) { row in
                VStack {
                    Text(row.headline)
                    ForEach(row.numbers, id: \.self) { text in
                        BingoButton(text: text)
                    }
                }
            }
        }
    }
}