iOS чат Tableview с перескоком прокрутки - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь реализовать просмотр таблицы чата на основе socket.io.В настоящее время он работает, как и ожидалось при начальной загрузке.Тем не менее, при попытке разбить на страницы вверх прокрутка нервная, кто-нибудь знает, как добиться плавной прокрутки, например, Whatsapp или мессенджер?

Эта функция используется для первоначальной загрузки первых 10 сообщений:

func handleGetMessages() {
    socket?.on("getMessagesResponse") { [weak self] data,ack in
        guard let strongSelf = self else { return }
        guard
            data.count > 0,
            let dataObject = data[0] as? [String: Any]
        else { return }
        if let error = dataObject["message"] as? String {
            strongSelf.showAlert(title: "", message: error, buttonTitle: "Got it")
        } else {
            let json = JSON(dataObject)
            guard let messagesArray = json["messages"].array else { return }
            guard let currentPage = json["currentPage"].int else { return }
            guard let lastPage = json["lastPage"].int else { return }
            strongSelf.currentPage = currentPage
            strongSelf.lastPage = lastPage
            messagesArray.forEach { messageObject in
                guard let messageObject = messageObject.dictionaryObject else { return }
                let message = Message(map: Map(mappingType: .fromJSON, JSON: messageObject))
                strongSelf.messages.insert(message, at: 0)
            }
            if strongSelf.isPaginating {
                strongSelf.isPaginating = false
                strongSelf.chatTableView.reloadData()
            } else {
                strongSelf.chatTableView.reloadData()
                guard strongSelf.chatTableView.numberOfRows(inSection: 0) - 1 > 0 else { return }
                let lastRow = strongSelf.chatTableView.numberOfRows(inSection: 0) - 1
                strongSelf.chatTableView.scrollToRow(at: IndexPath(row: lastRow, section: 0), at: .top, animated: false)
            }
        }
    }
}

и на willDisplayCell я делаю эту логику, чтобы узнать, достиг ли пользователь вершины или нет, увеличить счетчик страниц на единицу и получить больше сообщений

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == 0 && !isPaginating && currentPage != lastPage {
        currentPage += 1
        isPaginating = true
        getMessages()
    }
}

Из написанного кода я ожидал достичь чего-то вродеWhatsApp или мессенджер плавность при прокрутке, но в результате перескок прокрутки.

См. рисунок ниже для решения проблемы:

...