iOS:在重新载体时将Uitable View保持在相同的位置



我遇到了一个烦人的问题。我正在做一个消息传递应用程序。在消息页面中,当用户滚动到顶部时,一旦最上方的单元格变得可见,它将加载更多的消息以显示。因为在加载更多消息时,表视图的位置位于顶部(内容偏移为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。

相关内容

最新更新