我有一个包含书签的UITableView。如果没有书签,我想显示默认的“无书签”行。
书签是可编辑的。删除最后一个时,书签行将替换为默认的“[无书签]”行。但是由于内部断言,删除后的行数比以前少,Cocoa Touch不喜欢这种情况并且崩溃了。
当我在下面的屏幕截图中按删除时
该应用程序因以下错误崩溃:
无效更新:第0部分中的行数无效 更新(1)后必须包含在现有部分中的行 等于之前该部分中包含的行数 更新(1),加上或减去插入或删除的行数 该部分(0插入,1删除)和加号或减号的数量 移入或移出该部分的行(0移入,0移出)。
而不是显示:
我们非常感谢任何建议。
答案 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
});