reloadRowsAtIndexPath防止scrollToRowAtIndexPath

时间:2018-12-07 21:10:36

标签: ios swift

我正在用SWIFT开发聊天应用程序。


无论何时用户发送聊天消息,都会将其添加到数据源中 与变量

var sending : Bool = true

如果将sending设置为true,则单元格将在消息提示框旁边显示一个小的“发送”图标。


问题是由于以下原因造成的: reloadRows()停止滚动

每当发送一条消息时,它都会被添加到tableView中,并且tableView会向下滚动到新消息:

self.tableView.scrollToRow(at: IndexPath(row: dataSource.count-1, section: 0), at: .bottom, animated: true)

但是

聊天服务器几乎立即响应发送是否成功

如果是,则聊天消息sending变量将设置为false并重新加载单元格:

self.tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)

问题是由于reloadRows似乎阻止了滚动,因此滚动不会发生。 (行的高度没有变化,所以我不明白)


当前,我正在执行以下操作来解决此问题,但是必须有其他解决方案:

如果tableView没有滚动,我只是重新加载该行。 如果正在滚动,则应用程序将等待,它会收集所有需要重新加载的行,并在scrollViewDidEndDeclearing

之后执行

代码:

    var reloadRows : [IndexPath] = []
    var isTableViewScrolling : Bool = false
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        if scrollView == tableView {
            isTableViewScrolling = true
        }
    }
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

        if scrollView == tableView {
            isTableViewScrolling = false

            if reloadRows.count > 0 {
                // Reload the needed rows
                self.tableView.reloadRows(at: reloadRows, with: .none)
                reloadRows = []
            }
        }
    }
    @objc func notification_sentMessageCallback(notification: NSNotification){

        DispatchQueue.main.async {
            if let chatRoomId = notification.userInfo?["chatRoomId"] as? Int, let id = notification.userInfo?["id"] as? Int {

                if (self.currentChatRoomId == chatRoomId){

                    guard let index = ChatStore.shared.chatRoom(id: chatRoomId).messages.index(where: { $0.id! == id }) else {
                        return
                    }

                    if self.isTableViewScrolling {

                        self.reloadRows.append(IndexPath(row: index, section: 0))
                    } else {
                        self.tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)

                    }


                }
            }
        }

    }

0 个答案:

没有答案