UITableView тянуть, чтобы обновить и нумерацию страниц, используя willDisplay - PullRequest
0 голосов
/ 25 октября 2018

Это мой третий день, и после прочтения почти десятков речей я не мог понять, как реализовать разбиение на страницы в UITableview, используя метод willDisplay.Я пытаюсь имитировать функцию iMessages pull to paginate.

Мой код, приведенный ниже, переходит в бесконечный цикл при попытке обновления в первый раз.

Может кто-нибудь взглянуть на код и предложить способисправить бесконечную загрузку?

Tx заранее.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if indexPath.row == 0 && !self.isLoading {

        self.isLoading = true

        fetchClientsMessages(page: self.currentPage, completed: {

            if self.currentPage == 0 {
                self.messageArray.removeAll()
            }

            self.messageArray.append(contentsOf: self.clientChatMessages!.messages!)

            // Sort message by ID so that latest message appear at the bottom.
            self.messageArray = self.messageArray.sorted(by: {$0.id! < $1.id!})

            self.messagesTable.reloadData()

            // Scroll to the top
            self.messagesTable.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)

            self.lastPage = self.currentPage

            self.currentPage = self.currentPage + 1
            self.isLoading = false
        })

    }

}

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы должны переместить прокрутку и reloadData в последнюю очередь в методе fetchClientMessages

    fetchClientsMessages(page: self.currentPage, completed: {

        if self.currentPage == 0 {
            self.messageArray.removeAll()
        }

        self.messageArray.append(contentsOf: self.clientChatMessages!.messages!)

        // Sort message by ID so that latest message appear at the bottom.
        self.messageArray = self.messageArray.sorted(by: {$0.id! < $1.id!})

        self.lastPage = self.currentPage

        self.currentPage = self.currentPage + 1
        self.isLoading = false

        self.messagesTable.reloadData()

        // Scroll to the top
        self.messagesTable.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)
    })

Дайте мне знать, если это работает.

0 голосов
/ 25 октября 2018

Сначала загрузите код внутри, если будет работать, затем в его обратном вызове вы делаете

self.messagesTable.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)
self.isLoading = false

, который снова вызовет willDisplay при indexPath = 0 и isLoading = false => бесконечной загрузке, что выхотите слегка прокрутить таблицу вниз, чтобы указать загруженные данные, а затем оставить пользовательскую прокрутку вверх, пока снова не нажмете индекс = 0

...