当我使用commitEditingStyle从UITableView删除一行时,我的应用程序崩溃并显示以下错误消息。奇怪的是我从第3节删除。根据消息的不一致来自第4节。
*断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-1262.60.3 / UITableView.m:920 2010-11-22 19:56:44.789 bCab [23049:207] * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第4节中的行数无效。包含的行数更新后的现有部分(1)必须等于更新前的该部分中包含的行数(0),加上或减去从该部分插入或删除的行数(0插入,0删除)。 “
在数据源中,我根据第3节中的行数更新第4节。当从第3节删除行时,第4节中的行数从0变为1.这似乎导致了问题。有没有办法避免这个?
任何指针都将受到高度赞赏。 感谢。
更新:
numberOfSectionsInTableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
返回6;
}
numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
bCabAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
if (section == 0) { // First name, last name
return 2;
}
else if (section == 1) { // Password
return 2;
}
else if (section == 2) { // Mobile, DOB , Gender
return 3;
}
else if (section == 3) { // credit cards
return [creditCards count];
}
else if (section == 4) { // Add credit card
if ([creditCards count] >= 3) {
return 0;
}
else {
return 1;
}
}
else if (section == 5) {
return 0;
}
return 0;
}
commitEditingStyle
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
if (indexPath.section == 3) {
// Delete the row from the data source
NSLog(@"%d %d", indexPath.section, indexPath.row);
[creditCards removeObjectAtIndex:indexPath.row];
// Delete from backend
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
//[tableView reloadData];
}
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
我尝试使用和不使用[tableView reloadData]并获得相同的结果。
感谢您的帮助!
答案 0 :(得分:4)
在数据源中,我更新了第4节 取决于行数 第3节。从中删除行 第3节,第4节中的行数 从0到1,这似乎是原因 问题。没有办法避免 此?
使用deleteRowsAtIndexPaths:withAnimation
时,您可以保证数据源只删除具有指定索引路径的行。在您的情况下,您还在表中插入一行,这意味着数据源的状态不是表视图所期望的。
当删除第3部分中涉及在第4部分中插入行的行时,您必须执行以下操作:
[self.tableView beginUpdates];
[self.tableView [NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPath:[NSArray arrayWithObject:indexPathForInsertedRow] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
答案 1 :(得分:2)
在删除单元格之前,您是否删除了creditCards中的相应对象?
答案 2 :(得分:0)
如果删除第3部分中的行,如何在第4部分中添加新行? 这不是一个好的解决方案,但您可以尝试在删除行时生成reloadData。