【问题标题】:iOS: Keep UITableView at the same position when reloadDataiOS:在 reloadData 时保持 UITableView 在同一位置
【发布时间】:2018-04-01 08:16:00
【问题描述】:

我遇到了一个烦人的问题。我正在做一个消息传递应用程序。在消息页面中,当用户滚动到顶部时,一旦最顶部的单元格变得可见,它将加载更多要显示的消息。因为在加载更多消息时,表格视图的位置在顶部(内容偏移量为 0),在完成加载消息后,我调用 reloadData 并且 iOS 尝试保持偏移量,从而滚动到顶部再次查看表并触发另一个加载。这就像一个无限循环,直到没有更多消息要加载。 我试图在reloadData 之后立即致电scrollToRow,但没有成功。

所以任何可以在调用reloadData后保持表格视图在同一位置的东西(即,如果在加载之前,消息“a”在顶部,加载后,消息“a”仍然在屏幕顶部)对我有用。

在这方面花了几个小时,所以我非常感谢任何帮助。谢谢

【问题讨论】:

  • 不要打电话给reloadData。使用insertRows 添加新数据。

标签: ios swift uitableview


【解决方案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”(图片)
    • 我喜欢缩进
    猜你喜欢
    • 2012-04-05
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2017-12-14
    相关资源
    最近更新 更多