ios swift:连续删除单元格后,UITableViewCell的标签不会更新

时间:2016-09-21 16:43:15

标签: ios swift

我已根据传递的索引为任何行实现了删除功能。

每个单元格都有一个按钮来启动该行的删除。我使用cell.tag检测行并传递给删除使用indexPath和deleteRowAtIndexPaths(...)的函数。

现在,当我继续删除第0行时会出现问题。最初,它正确删除。第0行消失了。第1行替换第0行。 现在,如果我再次删除第0行,它将删除当前的第1行。

我理解的原因是cell.tag没有更新。 究竟我做错了什么? 问题不一致。如果我在删除之间等待,那就没问题。如果我删除一行又一行。它继续删除其他一行。

我现在该怎么办?我已经搜索过这个,无法找到合适的解决方案或指南?

以下是主要代码

// Typical code having Programmatic UITableView
// ...

func addTestEvent(cell: MyCell) {
    func onSomeAction() {
        dispatch_async(dispatch_get_main_queue(), {
            self.removeRow(cell.tag)
        })
    }

    ...
    // onSomeAction() called on click on the button
}


func test(cell: MyCell) -> () {
    ...
    addTestEvent(cell)

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier( NSStringFromClass(MyCell), forIndexPath: indexPath) as! MyCell
    cell.tag = indexPath.row
    cell.test = { (cell) in self.test(cell) }
    return cell
}


func removeRow(row: Int) {
    let indexPath = NSIndexPath(forItem: row, inSection: 0)
    tableView.beginUpdates()
    posts.removeAtIndex(row)
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    tableView.endUpdates()
}

2 个答案:

答案 0 :(得分:0)

关键是不要使用cell.tag来识别单元格。而是直接使用细胞。感谢Vadian comment。将indexPath保留在单元格标记中不是一个好习惯。现在我知道为什么了!

这个答案给了我解决问题的主要暗示。 https://stackoverflow.com/a/29920564/2369867

// Modified pieces of code. Rest of the code remain the same.

func addTestEvent(cell: MyCell) {
    func onSomeAction() {
        dispatch_async(dispatch_get_main_queue(), {
            self.removeRow(cell)
        })
    }
    // ...
    // onSomeAction() called on click on the button
}

func removeRow(cell: UITableViewCell) {
    let indexPath = tableView.indexPathForRowAtPoint(cell.center)!
    let rowIndex = indexPath.row
    // ...
}

答案 1 :(得分:0)

删除单元格后添加tableView.reloadData()。这对我有用。