Стек выглядит так:
Код: Выделить всё
class ViewModel: ObservableObject {
@Published
var isRefreshing = false
var components: [Int] = Array(0...100)
func refresh() {
isRefreshing = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.isRefreshing = false
}
}
}
struct ContentView: View {
@StateObject
var viewModel: ViewModel
var body: some View {
ScrollView(showsIndicators: false) {
LazyVStack(spacing: .zero, pinnedViews: [.sectionHeaders]) {
Section {
if viewModel.isRefreshing {
loadingView
} else {
ForEach(viewModel.components, id: \.hashValue) { _ in
Rectangle()
.frame(height: 700)
.foregroundStyle(Color.blue)
.padding(.bottom, 24)
}
}
} header: {
filterBar
.onTapGesture {
viewModel.refresh()
}
}
}
}
}
var filterBar: some View {
Rectangle()
.foregroundStyle(Color.yellow)
.frame(height: 100)
}
var loadingView: some View {
Rectangle()
.foregroundStyle(Color.green)
.frame(height: 300)
}
}
В большинстве случаев это работает нормально. Но в некоторых случаях LoadingView не отображается. Вместо этого весь вид пуст (я вижу только фон). Иногда он исчезает после обновления контента, но иногда он зависает на этом пустом контенте, пока пользователь не начнет прокручивать снова.
Запись показывает проблему. Немного прокручиваем представление, а затем нажимаем на фильтр. Вместо отображения загрузки он просто становится пустым. Иногда это работает нормально.

Пример выше был максимально упрощен. Тем не менее проблема сохраняется. Попытка прокрутить обратно вверх не решила проблему, поскольку пустой фон продолжает появляться время от времени.
Подробнее здесь: https://stackoverflow.com/questions/785 ... he-content
Мобильная версия