我正在用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)
}
}
}
}
}