Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UITableView删除行并显示';无内容';一行_Iphone_Ios_Uitableview - Fatal编程技术网

Iphone UITableView删除行并显示';无内容';一行

Iphone UITableView删除行并显示';无内容';一行,iphone,ios,uitableview,Iphone,Ios,Uitableview,我有一个包含书签的UITableView。如果没有书签,我想显示一个默认的“no bookmarks”行 书签是可编辑的。删除最后一行时,书签行将替换为默认的“[无书签]”行。但是Cocoa Touch非常不喜欢这种情况,并且由于内部断言删除后的行数应该比以前少而崩溃 当我在下面的屏幕截图中按delete键时 应用程序崩溃,出现以下错误: 无效更新:节0中的行数无效。人数 更新(1)后现有节中包含的行必须是 等于该节中包含的行数,在 更新(1),加上或减去从中插入或删除的行数 该部分(插入0,

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

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

当我在下面的屏幕截图中按delete键时

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

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

而不是显示这一点:


如有任何建议,将不胜感激

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



这一切都与删除处理代码有关,您当前在该代码中删除了最后一项和行。

尝试使用类似以下的块:

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

虽然@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];
    }
}
正如我所说的,这是一个对我更有意义的替代解决方案,而且它还具有只使用一个动画调用的好处


希望这有帮助

听起来像是在@Wain工作。这应该用什么方法来做呢?请看上面对@architectpianist答案的评论。谢谢那怎么解决呢?你打算把上面提到的放在哪里?谢谢。好的,所以这个代码片段的想法是在以后让一个动作排队。我想象你有一些东西,比如if(最后一行){然后添加一行},这就是我要放代码的地方。因此,它的工作方式是让删除代码先运行,然后在稍后添加行。如果您放置断点,您将注意到代码在稍后执行。是的,这起到了作用。我尝试了@Wain的解决方案,但还是失败了。断言发生在deleteRowsAtIndexPaths内部(之后没有机会调用insertRowsAtIndexPaths)。类似地,首先调用insertRowsAtIndexPaths和deleteRowsAtIndexPaths会导致崩溃。insertRowsAtIndexPaths中有相同的断言。经过一些测试,我意识到这种方法实际上也会导致bug。使用重新加载方法替换行,然后重新填充后,不能再删除重新填充的行。看看下面的问题-嗯,我以前从未见过这种情况。你确定是因为重新加载的代码?