滚动以加载数据。 Swift。 UI表格视图

Scroll to load data. Swift. UITableView

我的代码在通过滚动 table 到某一行来加载数据时遇到了一些问题,但我找不到原因。

基本上,我希望 table 在滚动到总元素 - 5 时加载接下来的 10 个元素。例如,我希望 table 最初加载 10 个元素。然后,当它碰到第五个元素时,它加载 11-20 个元素。

我的问题是当我最初加载 table 时,它只加载前 5 个元素,但我可以看到 6-10 之间有一些空格,然后我将 table 滚动到第五个元素,它加载接下来的 10 个元素 (6 - 15)。

let rowPerPage = 10

func refreshResults(){
    // append data from server //
    self.resultsTitleArray.append(...)

    if self.resultsTitleArray.count != 0 {
        let minCount = min(rowPerPage, self.productImageArray.count) - 1
        self.currentResultsTitleArray += self.resultsTitleArray[0...minCount]
    }

    self.resultsTable.reloadData()
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return currentResultsTitleArray.count
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let diff = rowPerPage - 5
    let currentDiff = currentResultsTitleArray.count - 1 - indexPath.row
    if currentResultsTitleArray.count != resultsTitleArray.count && diff == currentDiff {
        let minCount = min(resultsTitleArray.count, currentResultsTitleArray.count + rowPerPage as Int) - 1
        let next = self.currentResultsTitleArray.count
        self.currentResultsTitleArray += self.resultsTitleArray[next...minCount]
        resultsTable.reloadData()
    }
}

就我个人而言,我会略微更改此 if 语句。您想要做的是在距离底部仅 5 时加载 10 个单元格。但它有点危险,因为它可能轻松加载多次。

您需要一个外部 var 来显示您迄今为止完成的最高成功负载并检查

if indexPath.row == currentResultsTitleArray.count - 6 && indexPath.row > self.highestIndexFetchedOn 应该是触发器,然后在成功获取后,就在重新加载数据之前,将 self.highestIndexFetchedOn 设置为新的 indexPath.row

不清楚 rowPerPage 做了什么,但我猜它是 10 而且 minCount 逻辑看起来是正确的,但我会打印出来以确保你'重新得到你所期望的。

if indexPath.row == currentResultsTitleArray.count - 4 && indexPath.row > self.highestIndexFetchedOn {

    let minCount = min(resultsTitleArray.count, currentResultsTitleArray.count + rowPerPage as Int) - 1
    let next = self.currentResultsTitleArray.count

    print("Count:",minCount)

    self.currentResultsTitleArray += self.resultsTitleArray[next...minCount]

    // etc...

    self.highestIndexFetchedOn = indexPath.row
    tableView.reloadData()
}

我不确定这里的数据结构,所有这些数组都包含不同的数据......我认为一个包含所有值的字典数组会更好,并简化我们正在看的内容.. 但我不能说 100% 没有看到 class 的其余部分..