iOS:滑动表格视图单元格时是否可以覆盖show-red-delete-button-method?

时间:2015-06-02 12:47:39

标签: ios objective-c

我的“删除表格视图 - 单元格左侧滑动”功能存在问题。

情况: 我有一个表视图,其中的内容由后台线程处理。有时会出现一个带有信息的弹出窗口,表格视图的新元素可用。点击“是”添加它,点击“否”丢弃它。要在以后删除元素,我使用上面提到的“delete-table-view-cell-with-left-swipe”-feature。一切正常。

问题: 一个特殊的星座导致应用程序崩溃。当我向左滑动时,红色删除按钮变为可见。在那一刻,后台线程将触发弹出窗口。我单击“是”将元素添加到表视图中。弹出窗口消失,我点击删除按钮。 CRASH!

碰撞报告:

Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-3347.44/UITableView.m:1623
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Invalid update: invalid number of rows in section 0.  
The number of rows contained in an existing section after the update (1) 
must be equal to the number of rows contained in that section before the update (1), 
plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted)
and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

First throw call stack:
(0x1864cc2d8 0x197cf00e4 0x1864cc198 0x187380ed4 0x18b0f2ec8 0x10007fcc4 0x18b10cf10 0x18b2028ec 0x18af41404 0x18af2a4e0 0x18af40da0 0x18aefffc0 0x18af3a898 0x18af39f50 0x18af0d18c 0x18b1ae324 0x18af0b6a0 0x186484240 0x1864834e4 0x186481594 0x1863ad2d4 0x18fbc36fc 0x18af72fac 0x100106cb8 0x19836ea08)
libc++abi.dylib: terminating with uncaught exception of type NSException**

原因:

显然,崩溃的原因是表视图中行数的不一致。启动delete-procedure时,1元素在列表中。单击删除按钮后,列表中不应再有(0)元素。由于删除过程期间即将出现的新元素,当删除过程结束时,将剩下一个元素。我认为这会导致应用程序崩溃。

解决方案:

事实上,问题的解决方案并不困难。最简单的方法是在删除过程正在进行时阻止新的即将到来的元素。

这是我的问题:我怎么能这样做?是否有一种简单的方法可以识别何时向左滑动表格视图单元并启动删除程序?识别删除按钮单击当然很容易,但不是我需要的。我找到了另一种解决方案,即实现一个可以处理滑动的自己的SwipableTableViewCellClass。但是更简单的解决方案会很好。

类似的东西:

  • 覆盖将单元格滑动到的方法时调用的方法 离开
  • 停止后台线程触发弹出窗口
  • 调用正常例程以使红色删除按钮可见

有谁知道如何解决我的问题? Thx提前!

修改

处理删除按钮单击的方法如下所示:

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
        [tableView endUpdates];
     }
}

1 个答案:

答案 0 :(得分:1)

我相信您可以实施以下UITableViewDelegate方法来检测开始和结束。

// The willBegin/didEnd methods are called whenever the 'editing' property is
// automatically changed by the table (allowing insert/delete/move). This is 
// done by a swipe activating a single row
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;

只需创建一个标记以标记删除正在进行中并使用它来阻止或重新安排弹出窗口。