删除UITableView部分的最后一行时收到此错误。
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:无效的节数。包含在更新后的表视图部分的数目(2)必须更新(3)之前等于包含在表视图的部分的数量,加上或减去0插入或删除部分的数量(插入,0删除)。“
我的表有3个部分,如果数组的计数大于0(用户可以自己添加位置)。如果数组等于0那么表只包含2个部分,这就是我认为问题所在,我只是想不出来。
我删除单元格和更新数组的代码是:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* delCell = [tableView cellForRowAtIndexPath:indexPath];
delName = delCell.textLabel.text;
[self deleteLocation];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
-(void)deleteLocation {
NSLog(@"Name = %@",delName);
NSUserDefaults *customLocations = [NSUserDefaults standardUserDefaults];
NSUserDefaults *sharedPref = [NSUserDefaults standardUserDefaults];
[customLocations removeObjectForKey:delName];
[customLocations synchronize];
[customLoc removeObject:delName];
saveCustomLoc = [NSArray arrayWithArray:customLoc];
[sharedPref setObject:saveCustomLoc forKey:@"CustomLocations"];
[sharedPref synchronize];
NSLog(@"%@",saveCustomLoc);
NSLog(@"%lu",(unsigned long)[saveCustomLoc count]);
[self showAlert];
}
- (void) showAlert {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Location Deleted"
message:@"The location has been deleted"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
直到最后一个单元格才能正常工作。
我的表格设置方式示例如下:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
if ([customLoc count] == 0) { // If there is no data in the custom locations array the don't include that section
if (section == 0) {
return [serverSelection count];
}
else {
return [qServerSelection count];
}
}
else {
if (section == 0) {
return [customLoc count];
}
else if (section == 1) {
return [serverSelection count];
}
else {
return [qServerSelection count];
}
}
因此标题/行数/节数等取决于数组的内容。细胞被移除的部分消失的事实(或者突然有4个细胞进入第1部分移动到第0部分)我认为是导致问题。
任何想法如何解决这个问题?
答案 0 :(得分:0)
在研究了这个之后,我发现(在一些Apple论坛成员的帮助下),当从一个部分中删除最后一行时,您还需要明确删除该部分。
我还在开头和结尾添加了表更新代码,如下所示:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView beginUpdates];
UITableViewCell* delCell = [tableView cellForRowAtIndexPath:indexPath];
delName = delCell.textLabel.text;
[self deleteLocation];
if ([customLoc count] == 0) {
[tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationTop];
}
else {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
[tableView endUpdates];
}
因此,如果我的数组为0(实际上删除了最后一行),则删除该部分本身。