【问题标题】:Pagination with "data display limit" per page using UITableView使用 UITableView 每页带有“数据显示限制”的分页
【发布时间】:2021-03-31 13:01:32
【问题描述】:

我有一些来自APIdata,结构如下:

{
    "AssetType": "Watch",
    "checkDate": "2020-08-22",
    "totalCount": 31,
    "hasMore": true,
    "skip": 10,
    "items": [
        {
            "id": "150",
            "name": "Rolex",
            "includeExtraParts": 0,
            "package": "box",
            "unit": "g",
            "manufacture": null,
            "totalPrice": 1738.04310497
        },
       ... ..
    ]
}

到目前为止,我已经解析并显示了 UITableView 中的数据,并且我想在 hasMore 标志为 true 时获取更多数据,并希望在每个 fetch 中显示 10 个计数的 data我的UITableView 直到hasMore 标志变为false..

但是,我只能 fetch 并在我的 UITableView.. 中显示 10 个解析数据计数。 如何正确实施data pagination 以实现我想要完成的目标?

这是我到目前为止所尝试的,但它不能正常工作并且根本没有调用pagination 效果:

内部viewDidLoad()

 ApiCaller.getData(token: token, dataID: dataID, skip: skip, completion: { (response) in
    self.total = response.totalCount
    self.hasMore = response.hasMore
    self.skip = response.skip
    if self.skip < response.totalCount && response.hasMore == true {
        self.data = response.items
        
    }  else {
        return
    }
    self.tableVIew.reloadData()
})

还有我的func loadMore() 逻辑:

  func loadMore() {
        if (self.hasMore == false) {
            return
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                //calls the Api caller func inside viewDidLoad()
                self.getData()
            }
            
        }
    }

最后,在UITableViewDelegate 内部,我这样做/这样称呼它:


    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        
        if (self.hasMore == false) || (self.data.count == 0) {
            return
        }
        
        if indexPath.row == self.data.count - 3 {
            loadMore()
        }        
    }

它不工作。谁能帮我解决这个逻辑,好吗?

【问题讨论】:

  • 在主 ui 线程上重新加载 tableview
  • 也不需要-3,-1也可以。
  • 你加载更多函数只需要检查 hasmore 属性而不是从服务器获取数据

标签: ios json swift uitableview pagination


【解决方案1】:

看起来你每次获取新数据时都会覆盖你的 self.data 属性。我假设这个属性是一个数组。如果是使用.append(contentsOf:)方法将新获取的数据添加到已经获取的数据中。

if self.skip < response.totalCount && response.hasMore == true {
   self.data = response.items // You are overriding your data each time here       
 }

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2015-07-07
    • 2021-05-16
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多