Как установить состояние переключения в цикле foreach в SwiftUI - PullRequest
1 голос
/ 16 июня 2019

Когда я пытаюсь установить переключатель показа внутри цикла значений из словаря, я получаю очень мало помощи из сообщения об ошибке.

Если я откомментирую 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")
                            }
                        }
                    }
                }
            }
        }
    }
}

1 Ответ

2 голосов
/ 16 июня 2019

Проблема здесь в том, что инициализатор 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 к самому массиву, который преобразуется в привязки к каждому из элементов.

EDIT:

Чтобы вышеприведенное сработало, вам нужно добавить .value в нескольких местах в теле, чтобы вы ссылались на фактические значения, а не на привязки к значениям.

...