从UITableView中删除部分时出错

时间:2012-01-13 15:51:25

标签: ios objective-c uitableview rows

我需要你的帮助:(

我正在开发一个iOS应用程序,我必须在UItableView中删除一些行和部分。

我在使用Xcode 4。

我将tableView与NSarray和字典相关联,如下所示:

NSMutableArray *arrTemp1 = [[NSMutableArray alloc]
                         initWithObjects:@"Chris",nil];

    NSMutableArray *arrTemp2 = [[NSMutableArray alloc]
                         initWithObjects:@"Bianca",nil];

    NSMutableArray *arrTemp3 = [[NSMutableArray alloc]
                         initWithObjects:@"Candice",@"Clint",@"Chris",nil];

    NSMutableArray *arrTemp4 = [[NSMutableArray alloc]
                                initWithObjects:@"Candice",@"Clint",@"Chris",nil];

    NSMutableArray *arrTemp5 = [[NSMutableArray alloc]
                                initWithObjects:@"Candice",@"Clint",@"Chris",nil];

    NSMutableArray *arrTemp6 = [[NSMutableArray alloc]
                                initWithObjects:@"Candice",@"Clint",@"Chris",nil];

    NSMutableDictionary *temp = [[NSMutableDictionary alloc]
                         initWithObjectsAndKeys:arrTemp1,@"A",arrTemp2,
                                 @"B",arrTemp3,@"C",arrTemp4, @"D", arrTemp5, @"E", arrTemp6, @"J",nil];
    self.tableContents = temp;
    self.sortedKeys =[[self.tableContents allKeys]
                      sortedArrayUsingSelector:@selector(compare:)];

当我需要删除行或部分时,我正在使用此代码 - >

(void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {   
        NSMutableArray *listData = [self.tableContents objectForKey:
                            [self.sortedKeys objectAtIndex:[indexPath section]]];
        NSUInteger row = [indexPath row];

        [listData removeObjectAtIndex:row];

        [tableView beginUpdates];


        if ([listData count] > 0)
        {
            // Section is not yet empty, so delete only the current row.
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
        }
        else
        {
            // Section is now completely empty, so delete the entire section.
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
                     withRowAnimation:UITableViewRowAnimationFade];
        }

       [tableView endUpdates];
    }
}

当我删除行时,效果很好.. 当我删除部分时,我收到以下错误: “的 *在声明失败 - [UITableView的_endCellAnimationsWithContext:],/SourceCache/UIKit/UIKit-1912.3/UITableView.m:1030 2012-01-13 16:42:45.261 * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:无效的节数。更新后的表视图中包含的节数(6)必须等于更新前的表视图中包含的节数(6),加上或减去插入或删除的节数(0插入,1删除)'。“

 (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [tableContents count]; // tableContent is a NSMUtableDictionnary*
}

- (NSInteger)tableView:(UITableView *)table
 numberOfRowsInSection:(NSInteger)section 
{
    NSArray *listData =[self.tableContents objectForKey:
                        [self.sortedKeys objectAtIndex:section]];
    return [listData count];
}

我变得疯狂了,来到stackOverflow寻求帮助......

(抱歉我的英文不好:()

感谢大家阅读和回答!!

2 个答案:

答案 0 :(得分:2)

当它不包含任何对象时,您实际上并没有删除空数组的字典键,因此您调用

        // Section is now completely empty, so delete the entire section.
        [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
                 withRowAnimation:UITableViewRowAnimationFade];

导致问题,因为您仍然具有与之前相同数量的部分(字典键)...

答案 1 :(得分:1)

尝试更换这两行:

[listData removeObjectAtIndex:row];

[tableView beginUpdates];

所以它应该是:

[tableView beginUpdates];

[listData removeObjectAtIndex:row];