我有一个应用程序,可以从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/

10-11 19:47