当我刷新tableview时,我遇到了一个奇怪的问题。 (我正在使用UIRefreshControl
。)如果我要缓慢发生的事情:
假设有3个单元格可见,A,B和C,按顺序从上到下。
1)我拉下来,桌面视图显示它很新鲜。
2)A获取应该进入的文本B. B获取应该进入的文本C. C在屏幕外。
3)刷新结束,桌子快速回到原位。
4)错误的文字会持续一秒左右。
5)每个单元格的文本翻转到正确的位置。
在视觉上看起来非常烦人。无论如何,我觉得这是一个可以用一行我不知道的代码修复的问题。
以下是我的代码的摘录:
刷新时调用的函数(从CloudKit获取记录):
func refreshTable(sender: UIRefreshControl) {
var postsPredicate = NSPredicate(format: "%K = %@", VISIBILITY_CODE, WORLD) // default
if sender.tag == 0 {
postsPredicate = NSPredicate(format: "%K = %@", VISIBILITY_CODE, WORLD)
}
else if sender.tag == 1 {
postsPredicate = NSPredicate(format: "%K = %@", VISIBILITY_CODE, PRIVATE)
}
else {
// report problem
}
let query = CKQuery(recordType: POST, predicate: postsPredicate)
let sort = NSSortDescriptor(key: "creationDate", ascending: false)
query.sortDescriptors = [sort]
self.db.perform(query, inZoneWith: nil) { records, error in
if error == nil {
self.list = [records!]
DispatchQueue.main.async(execute: {
self.postTableView.reloadData()
self.refreshControl.endRefreshing()
})
}
else {
if let error = error as? CKError {
print(error)
}
}
}
}
这是我的cellForRowAtIndexPath
功能:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if self.list.count == 1 && self.list[0].count == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: NO_POSTS, for: indexPath)
return cell
}
let post = self.list[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: POST_IN_FEED_CELL, for: indexPath)
if let postCell = cell as? PostInFeedTableViewCell {
// deleted the assignment of values to other UI elements in my custom cell
let predicate = NSPredicate(format: "%K = %@", LIBRARY_CODE, post.object(forKey: LIBRARY_CODE) as! String)
let query = CKQuery(recordType: LIBRARY_ITEM, predicate: predicate)
self.db.perform(query, inZoneWith: nil) { records, error in
if error == nil {
let libraryItem = records?[0]
DispatchQueue.main.async(execute: {
postCell.title.text = libraryItem?.object(forKey: NAME) as! String
})
}
else {
if let error = error as? CKError {
print(error)
}
}
}
}
return cell
}