简体   繁体   English

达到页面限制后,Table View滚动到顶部加载更多内容不会停止加载

[英]Table View scroll to top load more doesn't stop loading after page limit is reached

Following is my code in which I load more content at the top on pull down. 以下是我的代码,其中在下拉菜单的顶部加载了更多内容。 When I reach last page and pull again it keeps calling fetchMessages. 当我到达最后一页并再次拉动时,它会继续调用fetchMessages。 How do I stop this code showing load more cell and stop fetching more data when page limit is reached? 当达到页数限制时,如何停止显示加载更多单元格的代码并停止获取更多数据?

class ViewController: UIViewController {

    @IBOutlet weak var messagesTable: UITableView!

    private var messageArray: [String] = []

    let pageSize: Int = 20
    let totalPages: Int = 3
    var currentPage: Int = 0
    var isLoading: Bool = false
    var hasMore: Bool = true

    private func loadMoreMessages() {
        if self.isLoading {
            return
        }

        if self.currentPage < 1 {
            self.loadMessagesFirstTime()
            return
        }

        self.isLoading = true
        fetchMessages(page: self.currentPage + 1) { (messages) in
            if messages.count > 0 {
                for message in messages {
                    self.messageArray.insert(message, at: 0)
                }
                self.messagesTable.reloadData()

                let lastIndexPath = IndexPath(row: messages.count - 1, section: 0)
                self.messagesTable.scrollToRow(at: lastIndexPath, at: UITableViewScrollPosition.top, animated: false)

                self.currentPage += 1
            } else {
                self.hasMore = false
                self.messagesTable.reloadData()
            }

            self.isLoading = false
        }
    }

    private func loadMessagesFirstTime() {
        print("loadMesagesFirstTime")
        self.isLoading = true
        self.hasMore = true
        self.currentPage = 1

        fetchMessages(page: 1) { (messages) in
            self.messageArray.removeAll()

            if messages.count > 0 {
                self.messageArray.append(contentsOf: messages.reversed())
                self.messagesTable.reloadData()

                let lastIndexPath = IndexPath(row: self.messagesTable.numberOfRows(inSection: 0) - 1, section: 0)
                self.messagesTable.scrollToRow(at: lastIndexPath, at: UITableViewScrollPosition.bottom, animated: false)
            } else {
                self.hasMore = false
                self.messagesTable.reloadData()
            }

            self.isLoading = false
        }
    }
}

extension ViewController {
    func fetchMessages(page: Int, completed: @escaping ([String]) -> Swift.Void) {
        print("fetchMessages, page: \(page)")
        DispatchQueue.global().async {
            sleep(1)

            DispatchQueue.main.async {
                var messages: [String] = []

                if page <= self.totalPages {
                    for index in 0..<self.pageSize {
                        messages.append("Row \((page-1) * self.pageSize + index)")
                    }
                }
                completed(messages)
            }
        }
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.hasMore {
            return self.messageArray.count + 1
        } else {
            return self.messageArray.count
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var row = indexPath.row
        if self.hasMore {
            if row == 0 {
                let reusableIdentifier = "LoadingCell"

                let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier) ??
                    UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: reusableIdentifier)
                cell.textLabel?.text = "Loading ..."

                return cell
            }
            row -= 1
        }
        let reusableIdentifier = "MessageTableViewCell"
        let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier) ??
            UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: reusableIdentifier)
        cell.textLabel?.text = self.messageArray[row]
        return cell
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if indexPath.row == 0 {
            loadMoreMessages()
        }
    }
}

Output: 输出:

loadMesagesFirstTime loadMesagesFirstTime

fetchMessages, page: 1 fetchMessages,页面:1

fetchMessages, page: 2 fetchMessages,页面:2

fetchMessages, page: 3 fetchMessages,页面:3

fetchMessages, page: 4 <== this shouldn't be called as we have reached page limit. fetchMessages,页面:4 <==不应调用此页面,因为我们已达到页面限制。

fetchMessages, page: 4 fetchMessages,页面:4

fetchMessages, page: 4 fetchMessages,页面:4

fetchMessages, page: 4 fetchMessages,页面:4

fetchMessages, page: 4 fetchMessages,页面:4

试试这个:

if page < self.totalPages

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM