0

我有一个包含书签的 UITableView。当没有书签存在时,我想显示一个默认的“无书签”行。

书签是可编辑的。删除最后一个时,书签行将替换为默认的“[无书签]”行。但是 Cocoa Touch 非常不喜欢这种做法,并且由于内部断言删除后的行数应该比以前少而崩溃。

当我在下面的屏幕截图中按删除时

在此处输入图像描述

该应用程序崩溃并出现以下错误:

无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数 (1),加上或减去数字从该部分插入或删除的行数(0 插入,1 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。

而不是显示这个:

在此处输入图像描述

任何建议将不胜感激。

4

3 回答 3

1

虽然@Wain 建议您删除一行并同时插入一行,但我想补充一点,您也可以使用单元格重新加载来达到相同的效果。该reloadRowsAtIndexPaths:withRowAnimation:功能有时会被忽略,但当您需要将一个单元格替换为另一种类型的单元格时,它非常方便。

实际上,当表视图通知您用户删除时,您会执行以下操作:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        //Delete the item from the data source first!

        //If there are no more items in the data source array for that section, reload the last remaining row. Otherwise, just delete the row.
        if ([myDataSourceArrayForTheAppropriateSection count] == 0)
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
        else
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
    }
}

就像我说的,这是一种对我来说更有意义的替代解决方案,而且它还具有只使用一个动画调用的好处。

希望这可以帮助!

于 2013-08-14T23:57:34.343 回答
0

尝试使用类似的块:

dispatch_async(dispatch_get_main_queue(), ^{
    //add row here.
    //reload table data
});
于 2013-08-14T21:17:41.343 回答
0

当您检测到删除是要删除的最后一项时,您有一些逻辑来显示您的默认行。发生这种情况时,您仍然可以删除该行,但如果之后的行数为 1(因为您的默认行),您需要同时插入一行。您现有的检测逻辑应该可以正常工作。


这一切都与您当前删除最后一项和行的删除处理代码有关。

于 2013-08-14T21:06:44.073 回答