我遇到了一个烦人的问题。我正在做一个消息传递应用程序。在消息页面中,当用户滚动到顶部时,一旦最上方的单元格变得可见,它将加载更多的消息以显示。因为在加载更多消息时,表视图的位置位于顶部(内容偏移为0(,在加载消息后,我致电reloadData
和iOS试图维护偏移,从而将其滚动到表的顶部。再次查看并触发另一个负载。这就像一个无限循环,直到没有更多消息加载为止。我试图在reloadData
之后立即致电scrollToRow
,但没有运气。
因此,任何可以将表视图保持在相同位置的任何东西(即,如果加载前,消息" a"在顶部,加载后,消息"仍然位于屏幕顶部的消息"(在调用reloadData
之后对我。
花了几个小时为此,因此我非常感谢任何帮助。谢谢
我不知道这是否有帮助,但是您可以在重新加载时尝试一下 -
if let indexPaths = tableView.indexPathsForVisibleRows {
tableView.reloadRows(at: indexPaths, with: .none)
} else {
tableView.reloadData()
}
不要调用 reloaddata 每次需要仅插入一行时;这是不良的习惯。
uitaiteView具有以下方法:
func insertRows(at indexPaths: [IndexPath],
with animation: UITableViewRowAnimation)
...以及自ios 11以来,也:
func performBatchUpdates(_ updates: (() -> Void)?,
completion: ((Bool) -> Void)? = nil)
...允许您作为一个组执行多个插入,删除,重新加载和移动操作。
使用现代 swift 您只能在"一行"中制作它与三元:
(tableView.indexPathsForVisibleRows)?.isEmpty ?? true ? tableView.reloadData() : tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none)
首先更新您的模型片段,然后调用tableView的方法。
看来您必须实施分页。将此方法用于API调用,它将在最后一个单元格时拨打API。
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
//Bottom Refresh
if scrollView == yourTableView {
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
if !isNewDataLoading {
isNewDataLoading = true
apiCall()
}
}
}
}
确保您将API成功响应后,将其设置为false。