Списки SwiftUI и OnAppear

Я заметил странное поведение событий OnAppear для представлений списка. Я бы подумал, что закрытие OnAppear будет запускаться всякий раз, когда на экране появляется представление, но, похоже, оно запускается сразу, когда загружается список.

Например, следующий код:

@State var rows: [String] = Array(repeating: "Item", count: 20)

var body: some View {

    List(0..<rows.count, id: \.self) { index in
        Text(verbatim: self.rows[index])
            .onAppear {
                print("BOOOOM")
            }
            .frame(height:400)
    }
}

... Я ожидал, что команда печати будет запущена пару раз при загрузке, а затем продолжит печать, пока я прокручиваю страницу вниз. Вместо этого он печатает 20 раз за раз, а затем снова, когда я начинаю прокручивать страницу вниз.

есть идеи?

2 ответа

Это было занозой в моем пресловутом когте в течение хорошего месяца

Я не могу объяснить, почему это происходит, но это как-то связано со списками в iOS 14 и настраиваемой высотой ячеек. Если вы удалите вы заметите, что «Boom» печатается правильное количество раз. Когда высота вашей ячейки будет увеличена за пределы обычной метки, iOS по-прежнему загрузит то же количество ячеек, но затем вернется к тем, которые находятся за пределами экрана (посмотрите на модификатор вида).

Что ты можешь сделать?

1. Обновите до iOS 15

Это поведение правильно в iOS 15 и 13, поэтому, если вы можете, просто увеличьте минимальную цель развертывания и попрощайтесь с iOS 14.

2. Переключиться на

Верны своему названию: а также не делайте ничего больше, чем они должны, и произнесите «Бум» правильное количество раз. Недостатком является то, что вы теряете совместимость с iOS 13 и всю магию автоматической компоновки, которая идет с

Если вы с тех пор нашли способ сделать правильно работать в для iOS 14, ПОЖАЛУЙСТА, дайте мне знать

Я думаю, он ведет себя так, как ожидалось.

Для меня это было напечатано 15 раз на симуляторе с iPhone 7 и все 20 раз на симуляторе с iPhone 11.

Я немного изменил print("BOOOOM \(index)")

Вероятно, существует баланс с производительностью и ресурсами, который List соблюдает в фоновом режиме.

Загрузите слишком мало, и пользователь "застрянет", если прокрутка будет слишком быстрой, а при слишком большой загрузке и замедлении анимации прокрутки.

Другие вопросы по тегам