UITableView使用willDisplay进行刷新和分页

时间:2018-10-25 14:49:37

标签: ios swift uitableview pagination pull-to-refresh

这是我的第三天,在阅读了几乎所有的评论之后,我不知道如何使用willDisplay方法在UITableview中实现分页。我正在尝试模仿iMessages的分页功能。

我的以下代码在第一次刷新时进入无限循环。

任何人都可以调查代码并提出解决无限加载的方法吗?

提前发送。

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 :(得分:0)

首先加载if将会运行的代码,然后在其回调中执行

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

这将在willDisplayindexPath = 0 =>无限加载时再次触发isLoading = false,您想要的是稍微向下滚动表以指示已加载数据,然后让用户向上滚动直到再次达到索引= 0

答案 1 :(得分:0)

您应该将滚动和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)
    })

让我知道它是否有效。