iOS:在 reloadData 时保持 UITableView 在同一位置
Posted
技术标签:
【中文标题】iOS:在 reloadData 时保持 UITableView 在同一位置【英文标题】:iOS: Keep UITableView at the same position when reloadData 【发布时间】:2018-04-01 08:16:00 【问题描述】:我遇到了一个烦人的问题。我正在做一个消息传递应用程序。在消息页面中,当用户滚动到顶部时,一旦最顶部的单元格变得可见,它将加载更多要显示的消息。因为在加载更多消息时,表格视图的位置在顶部(内容偏移量为 0),在完成加载消息后,我调用 reloadData
并且 ios 尝试保持偏移量,从而滚动到顶部再次查看表并触发另一个加载。这就像一个无限循环,直到没有更多消息要加载。
我试图在reloadData
之后立即致电scrollToRow
,但没有成功。
所以任何可以在调用reloadData
后保持表格视图在同一位置的东西(即,如果在加载之前,消息“a”在顶部,加载后,消息“a”仍然在屏幕顶部)对我有用。
在这方面花了几个小时,所以我非常感谢任何帮助。谢谢
【问题讨论】:
不要打电话给reloadData
。使用insertRows
添加新数据。
【参考方案1】:
我不知道这是否对您有帮助,但您可以在重新加载时尝试此操作-
if let indexPaths = tableView.indexPathsForVisibleRows
tableView.reloadRows(at: indexPaths, with: .none)
else
tableView.reloadData()
【讨论】:
还要检查 !indexPaths.isEmpty。很酷的答案。【参考方案2】:当你只需要插入一行时,不要每次都调用reloadData;这是不好的做法。
UITableView 有方法:
func insertRows(at indexPaths: [IndexPath],
with animation: UITableViewRowAnimation)
...从 iOS 11 开始,还有:
func performBatchUpdates(_ updates: (() -> Void)?,
completion: ((Bool) -> Void)? = nil)
...允许您作为一个组执行多个插入、删除、重新加载和移动操作。
【讨论】:
感谢您的回答,我确实试过了,但是当插入行时,它会将现有行向下推并仍然位于顶部。【参考方案3】:使用现代 swift,您可以使用三元“仅一行”:
(tableView.indexPathsForVisibleRows)?.isEmpty ?? true ? tableView.reloadData() : tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none)
【讨论】:
【参考方案4】:首先更新你的modelArray,然后调用TableView的reloadData()方法。
看来你必须实现分页。使用此方法进行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 成功响应后将 isNewDataLoading 设置为 false。
【讨论】:
guard
是你的朋友 ;)
谷歌“Indent Hadouken”(图片)
我喜欢缩进以上是关于iOS:在 reloadData 时保持 UITableView 在同一位置的主要内容,如果未能解决你的问题,请参考以下文章
UITableView reloadData 在没有行的情况下无法工作
通过 reloadData 更新 UITableView 时保持选择
使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置
为啥 UITableView contentOffset 在 tableview reloadData 期间变化很大,而不是保持不变? reloadData 后如何使其保持不变?