如何在 SwiftUI 的 foreach 循环中设置切换状态
How do I set the toggle state in a foreach loop in SwiftUI
当我尝试在字典中的值循环内设置显示切换时,我从错误消息中得到的帮助很少。
如果我取消注释下面的 3 行注释代码,尝试为循环中的每个属性添加一个切换,我会收到以下错误:
无法将类型 'HStack, Text, ConditionalContent)>>' 的值转换为闭包结果类型“_”
import SwiftUI
struct properties {
var id : Int
var property : String
var isOn : Bool
}
struct ContentView: View {
@State var propertyValues: [properties] = [properties(id: 1, property: "DemoData", isOn: true),
properties(id: 2, property: "ShowLocalEvents", isOn: false)]
var body: some View {
NavigationView {
VStack {
List {
ForEach(propertyValues.identified(by: \.id)) { propertyValue in
HStack {
// Toggle(isOn: propertyValue.isOn) {
// Text("")
// }
Text("\(propertyValue.property)")
if propertyValue.isOn {
Text("On")
} else {
Text("Off")
}
}
}
}
}
}
}
}
这里的问题是初始化程序 Toggle(isOn:label:)
为其 isOn
参数采用了 Binding<Bool>
而不仅仅是 Bool
。 Binding<_>
是 readable-writable "view" 到 属性 的一种,它允许控件更新它不拥有的值,并将这些更改传播给任何人 是否拥有属性。
编辑:我把它变得比它需要的更复杂。以下作品:
ForEach($propertyValues.identified(by: \.id.value)) { (propertyValue: Binding<properties>) in
HStack {
Toggle(isOn: propertyValue.isOn) {
Text("")
}
// ...
}
}
通过使用 $propertyValues
,我们正在访问数组本身的 Binding
,它被转换为对每个元素的绑定。
编辑:
要使上述内容生效,您需要在正文的几个位置添加 .value
,以便您指的是实际值而不是值的绑定。
当我尝试在字典中的值循环内设置显示切换时,我从错误消息中得到的帮助很少。
如果我取消注释下面的 3 行注释代码,尝试为循环中的每个属性添加一个切换,我会收到以下错误:
无法将类型 'HStack, Text, ConditionalContent)>>' 的值转换为闭包结果类型“_”
import SwiftUI
struct properties {
var id : Int
var property : String
var isOn : Bool
}
struct ContentView: View {
@State var propertyValues: [properties] = [properties(id: 1, property: "DemoData", isOn: true),
properties(id: 2, property: "ShowLocalEvents", isOn: false)]
var body: some View {
NavigationView {
VStack {
List {
ForEach(propertyValues.identified(by: \.id)) { propertyValue in
HStack {
// Toggle(isOn: propertyValue.isOn) {
// Text("")
// }
Text("\(propertyValue.property)")
if propertyValue.isOn {
Text("On")
} else {
Text("Off")
}
}
}
}
}
}
}
}
这里的问题是初始化程序 Toggle(isOn:label:)
为其 isOn
参数采用了 Binding<Bool>
而不仅仅是 Bool
。 Binding<_>
是 readable-writable "view" 到 属性 的一种,它允许控件更新它不拥有的值,并将这些更改传播给任何人 是否拥有属性。
编辑:我把它变得比它需要的更复杂。以下作品:
ForEach($propertyValues.identified(by: \.id.value)) { (propertyValue: Binding<properties>) in
HStack {
Toggle(isOn: propertyValue.isOn) {
Text("")
}
// ...
}
}
通过使用 $propertyValues
,我们正在访问数组本身的 Binding
,它被转换为对每个元素的绑定。
编辑:
要使上述内容生效,您需要在正文的几个位置添加 .value
,以便您指的是实际值而不是值的绑定。