Использование переменной итератора SwiftUI ForEach в вызове привязки - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь использовать переменную итератора ForEach в представлении, которое требует привязки.

import SwiftUI

struct MyStruct: Identifiable {
    public var id = UUID()
    var name: String
    var repetitions: Int

}

struct ContentView: View {
    @State private var mystructs :[MyStruct] = [
        MyStruct(name: "John", repetitions: 3),
        MyStruct(name: "Mark", repetitions: 9)
    ]

    var body: some View {

        List {
            ForEach (mystructs) { st in
                VStack {
                    Text("\(st.name)")
                    TextField("Name", text: self.$mystructs[0].name)
                    TextField("Name", text: $st.name) // <- Got "Ambiguous reference..." error
                }
            }
        }
    }
}

Итератор ForEach работает, как продемонстрировано в текстовом представлении st.name. И первый TextField демонстрирует, что привязка к элементу mystructs работает. Однако для второго TextField, который является моим реальным вариантом использования, возникают следующие ошибки компилятора:

- Use of unresolved identifier $st
- Ambiguous reference to member of 'subscript'

Есть мысли?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

В описанном сценарии может быть сделано следующее

ForEach (mystructs.indices) { i in
    VStack {
        Text("\(self.mystructs[i].name)")
        TextField("Name", text: self.$mystructs[i].name)
    }
}

Обновление: вариант для более универсального c сценарий использования

ForEach (Array(mystructs.enumerated()), id: \.element.id) { (i, item) in
    VStack {
        Text("\(item.name)")
        TextField("Name", text: self.$mystructs[i].name)
    }
}
1 голос
/ 13 февраля 2020

Опираясь на ответ @ Аспери, это также работает:

var body: some View {
    List {
        Button("Add") {
            self.mystructs.append(MyStruct(name: "Pepe", repetitions: 42))
        }
        ForEach(mystructs.indices, id: \.self) { index in
            VStack {
                Text(self.mystructs[index].name)
                TextField("Name", text: self.$mystructs[index].name)
            }
        }
    }
}
1 голос
/ 13 февраля 2020

$ st приходит так же неразрешенным, что 'st' не является переменной состояния и не может использоваться для целей привязки.
Также $ mystructs работает, потому что он объявлен как переменная состояния и может использоваться для привязки.

Надеюсь, это вам пригодится! Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...