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 后如何使其保持不变?

调用 reloadData 后防止标头更新?

UITableView reloadData在iOS 11中重新出现时崩溃