Преобразовать простой список с выбранными элементами в SwiftUI

#list #foreach #swiftui #completion

#Список #foreach #swiftui #завершение

Вопрос:

Я конвертирую имеющийся у меня список с выбранными элементами через блок завершения в список SwiftUI. Вот с чем я сейчас работаю:

 struct MoreView: View {
    
    private let seasonArray = [Season]()
    
    var body: some View {
        List {
            ForEach(seasonArray, id:.self) { season in
                Text(season.name)
            }
         }
     }

    private mutating func fetchSeasons() {
        ContentManager().getSeasons() { response in
            seasonArray = response.sorted { $0.year < $1.year }
            // Reloaded tableview in UIKit here
        }
    }
}
  

Как лучше всего заполнить список с помощью seasonArray var после fetchSeasons() выполнения и возврата?

Ответ №1:

Вы можете установить @State оболочку свойства для seasonArray и присвоить ему пустое значение по умолчанию. Когда вы вызываете fetchSeasons функцию, она должна автоматически перезагрузить ваше представление без необходимости неявной перезагрузки, потому что SwiftUI прослушивает изменения для seasonArray как @State свойство.

Вы должны создать экземпляр ContentManager один раз, как константу.

 struct MoreView: View {
    
    private let contentManager = ContentManager()
    @State private var seasonArray: [Season] = []
    
    var body: some View {
        List {
            ForEach(seasonArray, id:.self) { season in
                Text(season.name)
            }
         }
     }

    private func fetchSeasons() {
        contentManager.getSeasons() { response in
            DispatchQueue.main.async {
                self.seasonArray = response.sorted { $0.year < $1.year }
                // Reloaded tableview in UIKit here
            }
        }
    }
}
  

Комментарии:

1. Все это имеет смысл. Однако, где мне сначала вызвать fetchSeasons() ?

2. Нашел способ. Я вызываю `.onAppear { self. Выборка сезона() } в списке.

3. Да, это работает. Вы также можете вызывать fetchSeasons() внутри пользовательского инициализатора.