Списки 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 и настраиваемой высотой ячеек. Если вы удалите
Что ты можешь сделать?
1. Обновите до iOS 15
Это поведение правильно в iOS 15 и 13, поэтому, если вы можете, просто увеличьте минимальную цель развертывания и попрощайтесь с iOS 14.
2. Переключиться на
Верны своему названию:
Если вы с тех пор нашли способ сделать
Я думаю, он ведет себя так, как ожидалось.
Для меня это было напечатано 15 раз на симуляторе с iPhone 7
и все 20 раз на симуляторе с iPhone 11
.
Я немного изменил print("BOOOOM \(index)")
Вероятно, существует баланс с производительностью и ресурсами, который List соблюдает в фоновом режиме.
Загрузите слишком мало, и пользователь "застрянет", если прокрутка будет слишком быстрой, а при слишком большой загрузке и замедлении анимации прокрутки.