gpt4 book ai didi

ios - 在 CustomTableViewCell.swift 中调用 prepareForReuse() 时,UITableViewCells 在从 UITableView (Swift 3) 中删除几次后变得无响应

转载 作者:行者123 更新时间:2023-11-28 09:33:55 30 4
gpt4 key购买 nike

我有一个应用程序可以从 Firebase 中提取对象,然后将它们显示在表格中。我注意到,如果我删除 5 个条目(这是关于我到达已删除的重用单元格的时间),我将无法再删除(红色删除按钮无响应)并且甚至无法选择单元格。当我在 TableViewCell.swift Controller 中注释掉 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 委托(delegate)中设置文本和图像等内容,并在 prepareForReuse 中重置单元格外观属性,如 alpha、编辑和选择状态。我不确定为什么当您注释掉该行并将 prepareForReuse 留空时它仍然表现不佳,因为只要您使用自定义表格 View 单元格,空的 prepareForReuse 就应该不影响性能。我只能假设这与您没有调用 prepareForReuse 的父类(super class)实现有关,根据文档,这是 Apple 要求的:

    override func prepareForReuse() {
// CELLS STILL FREEZE EVEN WHEN THE FOLLOWING LINE IS COMMENTED OUT?!?!
super.prepareForReuse()
}

prepareForReuse 方法仅用于对您的自定义单元格进行较小的清理。

关于ios - 在 CustomTableViewCell.swift 中调用 prepareForReuse() 时,UITableViewCells 在从 UITableView (Swift 3) 中删除几次后变得无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44341768/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com