Как обновить список в SwiftUI? - PullRequest
0 голосов
/ 26 июня 2019

Мой код немного сложнее, чем этот, поэтому я создал пример с той же ошибкой.

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

Как мне получить список для отображения созданного массива?

Я думаю, что проблема в том, что список не может быть обновлен, поскольку в нем уже есть объявленный пустой массив.

import SwiftUI

struct ContentView : View {

    @State var array = [String]()

    var body: some View {
        List(array.identified(by: \.self)) { item in
            Text("\(item)")
            }
            .onAppear(perform: createArrayItems)
    }

    func createArrayItems() {
        array = ["item1", "item2", "item3", "item4", "item5"]
    }

}

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Вы можете использовать объединенную структуру для обновления списка. Всякий раз, когда в объект DataProvider вносятся изменения, он автоматически обновляет список.

struct ContentView : View {

    @EnvironmentObject var data: DataProvider

    var body: some View {
        NavigationView {
            NavigationButton(destination: SecondPage()) {
                Text("Go to Second Page")
            }
            List {
                ForEach(data.array.identified(by: \.self)) { item in
                    Text("\(item)")
                }
            }
        }
    }
}

Добавить товары в список

struct SecondPage : View {
    @State var counter = 1
    @EnvironmentObject var tempArray: DataProvider
    var body: some View {
        VStack {
            Button(action: {
                self.tempArray.array.append("item\(self.counter)")
                self.counter += 1
            }) {
                Text("Add items")
            }
            Text("Number of items added \(counter-1)")
        }
    }
}

Он просто уведомит об изменении

import Combine

final class DataProvider: BindableObject {
    let didChange = PassthroughSubject<DataProvider, Never>()

    var array = [String]() {
        didSet {
            didChange.send(self)
        }
    }
}

Вам также необходимо внести некоторые изменения в SceneDelegate. Это обновление гарантирует, что ContentView имеет объект DataProvider в среде.

 window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(DataProvider()))
0 голосов
/ 26 июня 2019

Глупый пользовательский интерфейс - хороший интерфейс

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