0

删除 UITableView 部分中的最后一行时出现此错误。

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节数无效。更新后表视图中包含的节数(2)必须等于更新前表视图中包含的节数(3),加上或减去插入或删除的节数(0插入,0已删除)。

如果数组的计数大于 0,我的表有 3 个部分(用户可以自己添加位置)。如果数组等于 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];
        }
    }

所以标题/行数/节数等取决于数组的内容。我认为正在删除单元格的部分消失了(或者更确切地说,随着第 1 部分移动到第 0 部分,突然有 4 个单元格)这一事实导致了这个问题。

任何想法如何解决这个问题?

4

1 回答 1

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(实际上最后一行被删除),则该部分本身将被删除。

于 2013-03-17T06:00:48.897 回答