在一个ForEach
中只选择一个按钮可以通过以下方式实现:
@State
属性来跟踪选中的按钮。在循环中为每个按钮创建一个@State
属性,用于表示按钮是否被选中。struct ContentView: View {
struct Item: Identifiable {
let id = UUID()
let title: String
}
@State private var selectedButton: Item?
let items = [
Item(title: "Button 1"),
Item(title: "Button 2"),
Item(title: "Button 3")
]
var body: some View {
VStack {
ForEach(items) { item in
Button(action: {
selectedButton = item
}) {
Text(item.title)
.foregroundColor(selectedButton == item ? .red : .blue)
}
}
}
}
}
在上述代码中,我们使用@State
属性selectedButton
来表示选中的按钮。当按钮被点击时,我们更新selectedButton
的值为当前按钮的Item
对象。在循环中,我们根据selectedButton
的值来设置按钮的颜色,以区分选中和未选中状态。
Toggle
来实现单选按钮的效果。在循环中使用Toggle
来表示按钮的选中状态。struct ContentView: View {
struct Item: Identifiable {
let id = UUID()
let title: String
var isSelected = false
}
@State private var items = [
Item(title: "Button 1"),
Item(title: "Button 2"),
Item(title: "Button 3")
]
var body: some View {
VStack {
ForEach(items) { item in
Toggle(isOn: $items[getIndex(for: item)].isSelected) {
Text(item.title)
.foregroundColor(item.isSelected ? .red : .blue)
}
}
}
}
private func getIndex(for item: Item) -> Int {
guard let index = items.firstIndex(where: { $0.id == item.id }) else {
fatalError("Item not found")
}
return index
}
}
在上述代码中,我们为每个按钮的Item
对象添加了一个isSelected
属性来表示按钮是否被选中。在循环中,我们使用Toggle
来表示按钮的选中状态,并通过$items[getIndex(for: item)].isSelected
将选中状态绑定到Item
对象的isSelected
属性上。根据isSelected
的值,我们设置按钮的颜色以区分选中和未选中状态。
这两种方法都可以实现在一个ForEach
中只选择一个按钮的效果,具体选择哪种方法取决于你的需求和UI设计。
领取专属 10元无门槛券
手把手带您无忧上云