我正在iOS应用程序中实现无限滚动(当用户滚动到底部时-新的API调用用于获取更多值并将它们显示为表格视图单元格。)
当用户位于最后显示的单元格附近时,我将运行此功能
func loadItems() {
isFetchingMore = true
//reloading section 1 with loading indicator
tableView.reloadSections(IndexSet(integer: 1), with: .none)
let url = URL(string: someURL)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
let newItems = (self.items.count...self.items.count+10).map {
index in
Item(display_name: "item \(index)", location: "subitem \(index)")
}
self.items.append(contentsOf: newItems)
self.isFetchingMore = false
self.tableView.reloadData()
})
}
task.resume()
}
如您所见-通过地图功能添加了用于测试目的的新项目。在这种情况下,一切都会按预期进行。但是当我替换这个模拟物
let newItems = (self.items.count...self.items.count+10).map {
index in
Item(display_name: "item \(index)", location: "subitem \(index)")
}
带有从JSON获取数据的代码
if let json = try! JSONSerialization.jsonObject(with: data!) as? [String : Any] {
if let jsonItems = json["items"] as? [[String: Any]] {
for item in jsonItems {
if let display_name = item["display_name"] as? String,
let location = item["location"] as? String {
newItems.append(Item(display_name: display_name, location: location))
}
}
}
}
TableView在更新时开始闪烁。我在做什么错了?
答案 0 :(得分:0)
尝试这样的事情:
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadRows(at: [IndexPath(row: 10, section: 0), IndexPath(row: 11, section: 0)], with: .none)
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
请注意,您必须遍历现有可见单元格,并在3行代码中创建数组作为方法的第一个参数。
答案 1 :(得分:0)
尝试更新发生变化的单元格的属性,而不是重新加载整个tableView。