如何在 SwiftUI 中的 foreach 循环中设置切换状态

问题描述 投票:0回答:2

当我尝试在字典的值循环内设置显示切换时,我从错误消息中得到的帮助很少。

如果我取消注释下面的 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")
                            }
                        }
                    }
                }
            }
        }
    }
}
binding toggle swiftui
2个回答
8
投票

这里的问题是初始化器

Toggle(isOn:label:)
采用
Binding<Bool>
作为其
isOn
参数,而不仅仅是
Bool
Binding<_>
是属性中的一种可读可写的“视图”,它允许控件更新它不拥有的值,并将这些更改传播到拥有该属性的任何人。 编辑:我让这个变得比需要的更复杂。以下作品:

ForEach($propertyValues.identified(by: \.id.value)) { (propertyValue: Binding<properties>) in HStack { Toggle(isOn: propertyValue.isOn) { Text("") } // ... } }

通过使用 
$propertyValues

,我们可以访问数组本身的

Binding
,该数组将转换为对每个元素的绑定。

编辑:

要使上述工作正常进行,您需要在正文中的几个位置添加

.value

,以便引用实际值而不是值的绑定。

    


0
投票

ForEach($objects) { ($obj: Binding<Object>) in Toggle(obj.property, isOn: $obj.isOn) }

© www.soinside.com 2019 - 2024. All rights reserved.