Код хорошо работает на macOS и не работает на iOS (SwiftUI) - PullRequest
0 голосов
/ 26 февраля 2020

Код ниже хорошо работает на macOS (по крайней мере, Catalina 10.15.3), но тот же код (только копирование-вставка) не работает на iOS Simulator (13.2.2 / 13.3) и предварительный просмотр Xcode 11.3.1 ( приложение просто вылетает). Может кто-нибудь объяснить мне, что я делаю не так?

Проблема здесь: .onAppear(perform: self.initView) (при обновлении свойства users), но я не знаю, что не так.

struct User: Identifiable {
    let id = UUID()
    let name: String
}

struct ContentView: View {
    @State var users = [User]()
    var body: some View {
        List(users, id: \.id) { user in
            Text(user.name)
        }.onAppear(perform: self.initView)
    }

    func initView() {
        self.users = [User(name: "test")]
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

1 Ответ

0 голосов
/ 26 февраля 2020

Вот очень информативная часть сгенерированного cra sh log:

Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: неверное количество разделов. Количество разделов, содержащихся в табличном представлении после обновления (1), должно быть равно количеству разделов, содержащихся в табличном представлении до обновления (1), плюс или минус количество вставленных или удаленных разделов (1 вставлено, 0 удалено). '

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

Вот исправление (или обходной путь, что угодно), которое работает. Протестировано с Xcode 11.3 / iOS 13.3

func initView() {
    DispatchQueue.main.async { // postponed update till next event cycle
        self.users = [User(name: "test")]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...