Ошибка разбиения на страницы SwiftUI — ScrollView и GeometryReader — переменная @State не изменяет значение

#pagination #uiscrollview #swiftui #geometryreader

#разбивка на страницы #uiscrollview #swiftui #geometryreader

Вопрос:

итак, я в некоторой степени реализовал разбиение на страницы, однако есть ошибка. Кажется, что я могу выполнить только self.searchViewModel.loadMoreData() один раз, и это только тогда, когда представление было представлено.

Это мой полный код:

 @State var time = Timer.publish(every: 0.1, on: .main, in: .tracking).autoconnect()

var body: some View {
    ZStack {
        Color(SYSTEM_BACKGROUND_COLOUR)
            .edgesIgnoringSafeArea(.all)
        GeometryReader { geometry in
            VStack(alignment: .center) {
                ScrollView(.vertical, showsIndicators: false) {
                    VStack {
                        VStack(alignment: .leading)  {
                            if !self.searchViewModel.isLoading {
                                VStack {
                                    ForEach(self.searchViewModel.post, id: .postID) { post in
                                        VStack {
                                            HeaderCell(post: post)
                                            FooterCell(post: post)
                                                .onAppear {
                                                    self.time = Timer.publish(every: 0.1, on: .main, in: .tracking).autoconnect()
                                                    
                                            }
                                            .onReceive( self.searchViewModel.time) { (_) in
                                                if geometry.frame(in: .global).maxY < UIScreen.main.bounds.height - 80{
                                                    print("Getting data")
                                                    self.searchViewModel.loadMoreData()
                                                    self.time.upstream.connect().cancel()
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            
                        }
                    }
                }
            }
        }
    }.navigationBarTitle(Text("Results"), displayMode: .inline)
}
  

Я действительно верю, что это потому, что time не меняет его состояние. Поскольку консоль печатает «Получение данных» только один раз. Как только я прокручиваю до конца своего представления, после того, как собрана и представлена следующая группа данных, ничего не происходит. Я пытался разобраться с этим в течение нескольких часов.
Я читал о том, как @Binding намного лучше использовать, но я получаю постоянные ошибки всякий раз, когда пытаюсь это реализовать.

По сути, я просто хочу определить, когда пользователь прокрутил весь путь до конца моего ScrollView , чтобы я мог вызвать функцию для получения следующего пакета информации. Я перепробовал почти все возможные решения, но безуспешно. Я переместил и изменил оба onAppear amp; onReceived метода везде в пределах моего представления.

Любая помощь была бы очень признательна.

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

1. Этот подход не сработает, потому что ScrollView загружает / отображает весь предоставленный контент сразу во время создания. Вот почему вы видите печать только один раз.

2. @Asperi итак, был бы мой лучший вариант? Добавить кнопку с надписью Load More ?

3. Что-то вроде donnywals.com /…