首页 文章

重新加载数据时TableView闪烁

提问于
浏览
0

我正在iOS应用程序中实现无限滚动(当用户滚动到底部时 - 新的API调用用于获取更多值并将其显示为tableview单元格) .

当用户接近最后显示的单元格时,我运行此功能

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

如您所见 - 使用 Map 功能添加新项目以进行测试 . 在这种情况下,一切都按预期工作 . 但当我更换这个嘲笑

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开始在更新时闪烁 . 我究竟做错了什么?

2 回答

  • 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行代码中方法的第一个参数 .

  • 0

    尝试更新更改的单元格的属性,而不是重新加载整个tableView .

相关问题