2017-01-19 92 views
2

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

这是我想实现:

这是整个组数据:

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

现在,假设用户装载标记为粗体的那些和偏移量是一个row 8 ,如果用户向上滚动并到达row 7,我想加载并插入从1到5的行而不从row 7跳转。请记住,用户可能正在滚动,所以当数据传到手机时,它在row 6,所以我不能跳回到row 7,但保持滚动平滑和自然(只是在滚动时加载更多数据时发生的情况,数据被重新加载而没有tableview从行之间跳转)。

顺便说一下,偏移我的意思是UITableViewcontentOffset财产。

感谢您的帮助,我的确非常感谢!

回答

2

当您更新数据时,您需要先获取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游乐场并复制粘贴要点。

您必须注意的唯一一件事就是确保您知道要将行高添加到偏移量。

+1

谢谢!在回答之前,我试图计算每一行的偏移量,但是我发现自己有问题,例如偏移之间的跳转。我认为这是我试图计算刚好在'reloadData()'方法之后的偏移量(显然我保存了以前的偏移量)。 –

1

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

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

如果填充行需要对每一行进行网络请求,事情会变得更复杂一些。鉴于你在问题中使用“负荷”的,我不认为这是你在说什么,但如果这是你的情况,这里有一些提示:

  • 要求尽可能多行数据因为你可以尽早合理地做到这一点。单行显示的数据量通常很小,因此一次请求几百行数据不会有什么大不了的。

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

+0

尽管这个第一个答案直接影响了我的问题,但您的启发让我有了一个我稍后会用到的想法。这个想法是加载我需要的整个行集,但只是要求显示的数据,比方说第一个50,然后请求下一个需求,等等。就像你解释的那样。谢谢Caleb! –

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) 
} 
相关问题