ios 5:无效更新:部分中的行数无效

时间:2013-07-23 10:34:41

标签: iphone ios uitableview ios6 tablerow

iOS 5只有这个问题,iOS 6没问题

这是我的日志

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 3.  The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

我的代码

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[dictionary allKeys] count];
}


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

    NSArray *keyArray = [dictionary allKeys];
    return [[dictionary objectForKey:[keyArray objectAtIndex:section]] count];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
=    if (editingStyle == UITableViewCellEditingStyleDelete)
    {

        //First get all the keys of dictionary into one array
        NSArray *sectionsArray = [dictionary allKeys];
        //Get all the data of tapped section into one array by using indexpath.section
        NSMutableArray *objectsAtSection = [dictionary objectForKey:[sectionsArray objectAtIndex:indexPath.section]];
        //remove the particular object by using indexPath.row from the array
        [objectsAtSection removeObjectAtIndex:indexPath.row];
        // Update dictionary

        [table beginUpdates];

        // Either delete some rows within a section (leaving at least one) or the entire section.
        if ([objectsAtSection count] > 0)
        {
            [dictionary setObject:objectsAtSection forKey:[sectionsArray objectAtIndex:indexPath.section]];
            // Section is not yet empty, so delete only the current row.
            // Delete row using the cool literal version of [NSArray arrayWithObject:indexPath]
            [table deleteRowsAtIndexPaths:@[indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
        }else{
            [dictionary removeObjectForKey:[sectionsArray objectAtIndex:indexPath.section]];
            // Section is now completely empty, so delete the entire section.
            [table deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
                     withRowAnimation:UITableViewRowAnimationFade];
        }
        [table endUpdates];
    }
}
在iOS 5中删除一些行后,有些部分,我有这个问题。

你能帮我吗?

2 个答案:

答案 0 :(得分:3)

需要添加

[self.tableView reloadData];

self.editing = YES;

这是必需的,因为表视图最初没有关于其数据源和委托的信息;如果您创建表视图,则始终需要在初始化时发送reloadData消息。

希望它会帮助你

答案 1 :(得分:2)

好吧,好像我找到了答案。请参阅this SO question并回答,解释为什么使用allKeys方法很糟糕。

  

只要您不添加或删除字典中的任何元素,它们将保持相同的顺序,但只要您添加或删除元素,新订单就会完全不同。