【问题标题】:UITableView load more data when scrolling to top?UITableView 滚动到顶部时加载更多数据?
【发布时间】:2017-09-21 19:14:05
【问题描述】:

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

这是我想要达到的目标:

这是整组数据:

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

现在,假设用户加载了以粗体标记的行,并且偏移量在row 8,如果用户向上滚动并到达row 7,我想加载并插入从 1 到 5 的行而不跳转row 7。请记住,用户可能正在滚动,所以当数据到达手机时,它位于row 6,所以我不能将它跳回row 7,但要保持滚动流畅自然(当你加载更多时会发生什么向下滚动时的数据,即重新加载数据而不会从行之间跳转)。

顺便说一下,偏移量是指UITableViewcontentOffset 属性。

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

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    更新数据时,需要先获取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 并复制粘贴 gist。

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

    【讨论】:

    • 谢谢!在您回答之前,我试图计算每一行的偏移量,但我发现自己遇到了问题,比如偏移量之间的跳跃。我认为问题是我试图在 reloadData() 方法之后计算偏移量(显然我正在保存以前的偏移量)。
    【解决方案2】:

    @Pratik Patel Bellow 的回答是最好的。 在 Web 服务响应中右键或调用以下函数。

    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)
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      • 尽可能早地请求尽可能多的行的数据。单行显示的数据量通常很小,因此一次请求几百行应该没什么大不了的。

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

      【讨论】:

      • 虽然这个第一个答案直接解决了我的问题,但你的想法启发了我,我稍后会用到。这个想法是加载我需要的整组行,但只请求我将显示的数据,比如前 50 个,然后根据需要请求下一个,等等。正如你所解释的。谢谢迦勒!
      猜你喜欢
      • 2016-04-07
      • 1970-01-01
      • 2016-07-04
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多