我不能理解如何在SwiftUI @Binding
中结合使用ForEach
。假设我要Toggle
根据布尔数组创建s 的列表。
struct ContentView: View { @State private var boolArr = [false, false, true, true, false] var body: some View { List { ForEach(boolArr, id: \.self) { boolVal in Toggle(isOn: $boolVal) { Text("IsOn") } } } } }
我不知道如何将绑定传递给数组中的布尔对象Toggle
。上面的代码给出此错误:
使用未解决的标识符“ $ boolVal”
好的,这对我来说很好(当然)。我试过了:
struct ContentView: View { @State private var boolArr = [false, false, true, true, false] var body: some View { List { ForEach($boolArr, id: \.self) { boolVal in Toggle(isOn: boolVal) { Text("IsOn") } } } } }
这次错误是:
在'ForEach'上引用初始化程序'init(_:id:content :)'要求'Binding'符合'Hashable'
有办法解决这个问题吗?
在SwiftUI中,仅使用Identifiable结构而不是Bools
struct ContentView: View { @State private var boolArr = [BoolSelect(isSelected: true), BoolSelect(isSelected: false), BoolSelect(isSelected: true)] var body: some View { List { ForEach(boolArr.indices) { index in Toggle(isOn: self.$boolArr[index].isSelected) { Text("Is on") } } } } } struct BoolSelect: Identifiable { var id = UUID() var isSelected: Bool }
您可以使用类似下面的代码。请注意,您将获得不赞成使用的警告,但要解决此问题,请检查其他答案:https : //stackoverflow.com/a/57333200/7786555
import SwiftUI
struct ContentView: View {
@State private var boolArr = [false, false, true, true, false]
var body: some View {
List {
ForEach(boolArr.indices) { idx in
Toggle(isOn: self.$boolArr[idx]) {
Text("boolVar = \(self.boolArr[idx] ? "ON":"OFF")")
}
}
}
}
}