我有一个应用程序,可以从Firebase中提取对象,然后将它们显示在表中。我注意到如果我删除了5个条目(这是当我到达被删除的重复使用的单元格时),我就不能再删除了(红色的delete按钮没有响应)&甚至不能选择单元格。当我在TableViewCell.swift控制器中注释掉override func prepareForReuse()
时,此行为停止。为什么???
其余应用程序正常工作,而单元格只是没有响应。奇怪的是,如果我用一根手指按住一个单元格,用另一根手指轻敲单元格,我就可以选择单元格。然后,如果我用手指按住单元格并点击“删除”按钮,则该单元格将再次正常工作。这里发生了什么事??? 这是我的表格和单元格代码:
在CustomTableViewCell.swift>>
override func prepareForReuse() {
// CELLS STILL FREEZE EVEN WHEN THE FOLLOWING LINE IS COMMENTED OUT?!?!
cellImage.image = nil
}
在ViewController.swift中>>
override func viewDidLoad() {
super.viewDidLoad()
loadUserThings()
}
func loadUserThings() {
ref.child("xxx").child(user!.uid).child("yyy").queryOrdered(byChild: "aaa").observe(.value, with: { (snapshot) in
// A CHANGE WAS DETECTED. RELOAD DATA.
self.arr = []
for tempThing in snapshot.children {
let thing = Thing(snapshot: tempThing as! DataSnapshot)
self.arr.append(thing)
}
self.tableView.reloadData()
}) { (error) in
print(error)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
let cellData = arr[indexPath.row]
...
// SET TEXT VALUES OF LABELS IN THE CELL
...
// Setting image to nil in CustomTableViewCell
let imgRef = storageRef.child(cellData.imgPath)
let activityIndicator = MDCActivityIndicator()
// Set up activity indicator
cell.cellImage.sd_setImage(with: imgRef, placeholderImage: nil, completion: { (image, error, cacheType, ref) in
activityIndicator.stopAnimating()
delay(time: 0.2, function: {
UIView.animate(withDuration: 0.3, animations: {
cell.cellImage.alpha = 1
})
})
})
if cell.cellImage.image == nil {
cell.cellImage.alpha = 0
}
// Seems like sd_setImage doesn't always call completion block if the image is loaded quickly, so we need to stop the loader before a bunch of activity indicators build up
delay(time: 0.2) {
if cell.cellImage.image != nil {
activityIndicator.stopAnimating()
cell.cellImage.alpha = 1
}
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// instantly deselect row to allow normal selection of other rows
tableView.deselectRow(at: tableView.indexPathForSelectedRow!, animated: false)
selectedObjectIndex = indexPath.row
self.performSegue(withIdentifier: "customSegue", sender: self)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
print("should delete")
let row = indexPath.row
let objectToDelete = userObjects[row]
userObjects.remove(at: row)
ref.child("users/\(user!.uid)/objects/\(objectToDelete.nickname!)").removeValue()
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
if (self.tableView.isEditing) {
return UITableViewCellEditingStyle.delete
}
return UITableViewCellEditingStyle.none
}
最佳答案
一些事情。出于性能原因,您应该只使用prepareForReuse
重置与单元格外观相关而不是内容(如图像和文本)的属性。在tableView的cellForRowAtIndexPath
委托中设置文本和图像等内容,并在prepareForReuse
中重置alpha、editing和selection state等单元格外观属性。我不知道为什么当您注释掉那一行并将prepareForReuse
保留为空时,它会继续表现得很糟糕,因为只要您使用自定义表视图单元格,空的prepareForReuse
就不会影响性能。我只能假设这与您没有调用prepareForReuse
的超类实现有关,根据文档,这是Apple所要求的:
override func prepareForReuse() {
// CELLS STILL FREEZE EVEN WHEN THE FOLLOWING LINE IS COMMENTED OUT?!?!
super.prepareForReuse()
}
prepareForReuse
方法只用于对自定义单元格进行较小的清理。关于ios - 在CustomTableViewCell.swift中调用prepareForReuse()时,从UITableView中删除几次后,UITableViewCells变得无响应(Swift 3),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44341768/