UITableView在-tableView之后删除空部分:moveRowAtIndexPath:ToIndexPath:导致崩溃

时间:2013-06-21 16:38:47

标签: iphone objective-c uitableview

我正在使用- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;

功能,我检测fromIndexPath部分是否为空。如果是,那么我有以下代码:

    NSString *fromSection = [sections objectAtIndex:fromIndexPath.section];
    [savedTable beginUpdates];
    NSIndexSet *indexSections = [NSIndexSet indexSetWithIndex:[sections indexOfObject:fromSection]];
    [savedTable deleteSections:indexSections withRowAnimation:UITableViewRowAnimationFade];
    [sections removeObject:fromSection];
    [savedTable endUpdates];

但是这会导致应用程序崩溃并出现以下错误:

* 由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无效更新:第0部分中的行数无效。更新后的现有部分(0)必须等于更新前该部分中包含的行数(4),加上或减去从该部分插入或删除的行数(0插入,0删除)和加或减去移入或移出该部分的行数(0移入,0移出)。'

根据错误的说法,看起来当我删除(第一个)部分时,它没有注册,因此它认为第二部分中的4行已经不正确地移动到第一部分。如何让它知道该部分已被删除,这就是为什么4行已被移动到第一部分。这将停止NSInternalInconsistencyException错误。

**编辑:仅当删除部分下方有一个部分时,应用程序才会崩溃。这就是为什么要添加更多行"不正确"。在这种情况下,当我重新启动应用程序时,该部分已成功删除。一切似乎都很正常。

*我已经解决了这个问题。首先,当我结束更新时,我没有完全更新数据库。但即便如此,它也无济于事。所以我只使用了0.1秒的延迟来删除该部分,使用-performSelector:withObject:afterDelay:它工作正常!

2 个答案:

答案 0 :(得分:1)

这通常发生在执行

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

仍会返回您要删除的部分索引的已删除部分中的行数。请检查并确保此调用将返回“下一个”部分的行数(现在将在已删除部分的索引处进行...)。

答案 1 :(得分:0)

检查方法numberOfRowsInSectionnumberOfSectionsInTableView是否正确并致电[tableview reloadData]