我已根据传递的索引为任何行实现了删除功能。
每个单元格都有一个按钮来启动该行的删除。我使用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()
}
答案 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()
。这对我有用。