Как изменить элемент массива в Swiftui - PullRequest
0 голосов
/ 08 октября 2019

Как изменить элемент списка в Swift? (struct item)

@State var people: [Person] = [
        .init(firstName: "Steve",
              lastName: "Jobs", image: #imageLiteral(resourceName: "jobs"), jobTitle: "Founder of Apple"),
        .init(firstName: "Tim", lastName: "Cook", image: #imageLiteral(resourceName: "cook"), jobTitle: "Apple CEO"),
        .init(firstName: "Jony", lastName: "Ive", image: #imageLiteral(resourceName: "ive"), jobTitle: "Head of Design")
    ]

Я хочу передать элемент этого массива в другое представление, и это представление может изменить элемент (функция, подобная классу)

Я пытаюсь сделать так:

@State Person struct

Наблюдаемый объект (не работает) Проход (не работает)

на этом изображении изображена моя проблема

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

ObservableObject должно работать, если используется правильно, основная концепция SwiftUI имеет единый источник правды. Вот тут-то и появился Binding, однако если вы перебираете список, вы получаете значение Person, а не требуемое Binding<Person>. Вы можете использовать индексы на протяжении итерации и передавать его в TextForm, чтобы он мог получить исходный массив.

Чтобы сделать код более читабельным, я предлагаю иметь видовой модуль типа

class PeopleViewModel: ObservableObject {

    @Published var people: [Person] = [
        .init(lastname: "Some", firstname: "Dude"),
        .init(lastname: "Other", firstname: "Dude"),
    ]
}

Который вы должны смотреть в представлении, используя оболочку @ObservedObject.

struct PeopleList: View {

    @ObservedObject var viewModel = PeopleViewModel()

    var body: some View {
        NavigationView {
            List(viewModel.people.indices) { index in
                TextForm(viewModel: self.viewModel, index: index)
            }
        }
    }
}

И у TextForm есть индекс и конец экземпляра модели представления.

struct TextForm: View {

    @ObservedObject var viewModel: PeopleViewModel
    var index: Int

    var body: some View {
        VStack {
            TextField("textField", text: self.$viewModel.people[index].firstname)
            Text(self.viewModel.people[index].firstname)
        }
    }
}

Если вы действительно хотите опустить модель представления, просто пропустите индексирование через привязку.

            List(people.indices) { index in
                TextForm(item: self.$people[index])
            }
struct TextForm: View {

    @Binding var item: Person

    var body: some View {
        VStack {
            TextField("textField", text: self.$item.firstname)
            Text(self.item.firstname)
        }
    }
}
0 голосов
/ 08 октября 2019

Вы должны предоставить Binding. Например:

struct MySecondView: View {
    @Binding var people: [People]    

    var body: some View { ... }

    func modifyArray() { /* Do whatever you need here */ }
}

И передайте его этому представлению при инициализации в другом представлении, например:

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