UITableView删除行并显示“无内容”行

时间:2013-08-14 21:00:09

标签: iphone ios uitableview

我有一个包含书签的UITableView。如果没有书签,我想显示默认的“无书签”行。

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

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

enter image description here

该应用程序因以下错误崩溃:

  

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

而不是显示:

enter image description here

我们非常感谢任何建议。

3 个答案:

答案 0 :(得分: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];
    }
}

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

希望这有帮助!

答案 1 :(得分:0)

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


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

答案 2 :(得分:0)

尝试使用类似以下的块:

dispatch_async(dispatch_get_main_queue(), ^{
    //add row here.
    //reload table data
});