我正在使用一个聊天应用程序,希望当用户位于表视图底部时启用Firebase实时侦听器,以便添加新行并自动滚动表视图,但是当用户不在表底部时表格视图我不需要快照侦听器,因为它在用户尝试读取以上消息时会自动滚动表格视图。
我的解决方案:
var listener: ListenerRegistration!
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
heightDictionary[indexPath] = cell.frame.size.height
// Trigger pagination when scrolled to last cell
if (indexPath.row == commentArray.count - 1) {
// Listener is removed so no more realtime updates and tableview does not scroll automaticly
listener.remove()
paginate()
listernerNeedEnable = true
}
// User is at bottom of table view need to enable listener
if (indexPath.row == 0) {
print("indexPath.row == 0")
if listernerNeedEnable == true {
print("Re enable listiner")
// NEED TO RE ENABLE LISTENER HERE !!!
listernerNeedEnable = false
}
}
}
答案 0 :(得分:0)
Firestore建议不要让收听者的“流失率”很高,并且在此用例中不断切换可能会导致这种情况。更好的方法:如果在侦听器触发时表格已触底,请在插入新单元格后滚动到底部,否则只需插入单元格即可。您可以添加此扩展名以简化操作:
extension UIScrollView {
var isAtBottom: Bool {
return contentOffset.y >= contentSize.height + contentInset.bottom - bounds.height
}
}
if tableView.isAtBottom {
/* insert cells and then scroll to bottom to keep
the user at the bottom of the screen */
} else {
/* just insert cells */
}
如果您在插入单元格后表格是在“跳跃”或“滚动”,那么可能正在执行或可能未执行其他操作。
此外,您应该尝试使用performBatchUpdates
方法来利用表视图批处理更新。此方法使您有机会在插入单元格(也删除并重新加载)后滚动到底部,这就是您要执行的操作。