如何在SwiftUI

时间:2019-06-16 03:52:04

标签: binding toggle swiftui

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

如果我取消注释下面三行注释的代码,尝试为循环中的每个属性添加一个切换开关,则会出现以下错误:

无法将类型'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")
                            }
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

这里的问题是初始化器Toggle(isOn:label:)的{​​{1}}参数使用Binding<Bool>而不是isOnBool是属性的一种可读可写的“视图”,该属性允许控件更新它不拥有的值,并将那些更改传播给拥有的人财产。

编辑:我使它变得比所需的更为复杂。以下作品:

Binding<_>

通过使用ForEach($propertyValues.identified(by: \.id.value)) { (propertyValue: Binding<properties>) in HStack { Toggle(isOn: propertyValue.isOn) { Text("") } // ... } } ,我们可以访问数组本身的$propertyValues,该数组将转换为对每个元素的绑定。

编辑:

要使上述方法起作用,您需要在正文中的几个位置添加Binding,以便您引用的是实际值,而不是对值的绑定。