滚动到顶部时,UITableView会加载更多数据吗?

时间:2017-01-19 19:30:35

标签: ios swift uitableview

如何在滚动到顶部时加载更多数据而不会丢失当前偏移量UITableView

这是我想要实现的目标:

这是整套数据:

第1行
第2行
第3行
第4行
第5行
第6行
第7行
第8行 *
第9行
第10行
第11行
第12行
第13行
第14行
第15行

现在,假设用户加载了标记为粗体且偏移量为row 8的用户,如果用户向上滚动并到达row 7,我想加载并插入从1开始的行5没有从row 7跳过。请记住,用户可能正在滚动,所以当数据到达手机时它位于row 6,因此我无法将其跳回row 7,但保持滚动顺畅自然(仅在向下滚动时加载更多数据时会发生什么情况,重新加载数据而没有从行之间跳过tableview。)

顺便说一句,通过偏移,我的意思是contentOffset的{​​{1}}属性。

感谢您的帮助,我真的很感激!

3 个答案:

答案 0 :(得分:3)

更新数据时,首先需要获取tableView的当前偏移量。然后,您可以将添加数据的高度添加到偏移量并设置tableView的偏移量,如下所示:

func updateWithContentOffsset(data: [String]) {
    guard let tableView = tableView else {
        return
    }
    let currentOffset = tableView.contentOffset
    let yOffset = CGFloat(data.count) * tableView.rowHeight // MAKE SURE YOU SET THE ROW HEIGHT OTHERWISE IT WILL BE ZERO!!!
    let newOffset = CGPoint(x: currentOffset.x, y: currentOffset.y + yOffset)
    tableView.reloadData()
    tableView.setContentOffset(newOffset, animated: false)
}

您还可以查看我创建的gist。只需打开一个新的iOS Playground并复制粘贴要点。

您唯一需要注意的是确保您知道要添加到偏移量的行高。

答案 1 :(得分:2)

@Pratik Patel Bellow答案是最好的一个。 向下或在网络服务响应中调用波纹管功能。

func updateWithScroll(data: [String]) {
    guard let tableView = tableView else {
        return
    }
    guard let currentVisibleIndexPaths = tableView.indexPathsForVisibleRows else {
        return
    }
    var updatedVisibleIndexPaths = [IndexPath]()
    for indexPath in currentVisibleIndexPaths {
        let newIndexPath = IndexPath(row: indexPath.row + data.count, section: indexPath.section)
        updatedVisibleIndexPaths.append(newIndexPath)
    }
    tableView.reloadData()
    tableView.scrollToRow(at: updatedVisibleIndexPaths[0], at: .top, animated: false)
}

答案 2 :(得分:1)

  

现在,假设用户加载了标记为粗体的那些,偏移量位于第8行,如果用户向上滚动并到达第7行,我想加载并插入1到5行但不从第7行跳转

根据需要将数据加载到表中是UITableView自动为您执行的操作之一。不要尝试在表中插入行,因为当用户向它们滚动时很快就会需要它们 - 表视图将在需要时从其数据源请求这些行。您只需要确保您的数据源具有所需的信息,以便在单元格到达时满足表格请求。

如果填充行需要为每行发出网络请求,事情会变得复杂一些。鉴于你在问题中使用“加载”,我认为这不是你所说的,但如果你的情况如此,这里有一些提示:

  • 尽可能合理地请求尽可能多的行数据。单行显示的数据量通常较小,因此一次请求几百行不应该是一个大问题。

  • 如果您没有给定行所需的数据,请提出必要的请求,但请立即返回单元格。您返回的单元格可能使用微调器或其他数据待处理的指示。请求完成后,您可以告诉表重新加载相应的行,以便显示正确的内容。