当数组为空时,停止Tableview崩溃?

时间:2012-07-21 15:20:43

标签: iphone objective-c ios uitableview

首先我的表视图为空,然后您可以添加自己的单元格。删除这些单元格时,一切正常。但是,如果删除最后一个单元格,那么我的NSMutableArray中没有对象,我在控制台中收到此错误(同样,我使用Core Data来保存单元格):

 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (123150308) beyond bounds (1)'

我也尝试过这行代码,但我仍然得到相同的结果:

//arr is my mutable array
        if ([arr count] == 0) {
        NSLog(@"No Cells");
    }

这就是我从表格视图中删除对象的方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [arr removeObjectAtIndex:0];
        [context deleteObject:[arr objectAtIndex:0]];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

确定。

我在代码中发现了两个问题。

1-为什么要删除索引0处的每个时间对象?

2-从数组[arr removeObjectAtIndex:0];中删除对象后,从同一个索引数组中删除对象,将对象传递给核心数据以删除它

[context deleteObject:[arr objectAtIndex:0]];

这可能是问题所在。

这肯定会帮到你。

使用此:

[context deleteObject:[arr objectAtIndex:indexPath.row]];

[arr removeObjectAtIndex:indexPath.row];

谢谢:)

答案 1 :(得分:0)

如果你查看错误消息,你的代码失败的原因是因为你的一些代码正在寻找一个不存在的索引123150308.如果没有看到你的完整代码,那么确实错误是不可能的,但是有一个错误。简单的修复。

在异常为“预期行为”的代码中解决异常问题的一种好方法是使用@try块。这是tableView方法,其中包含@try块:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        @try {
            [arr removeObjectAtIndex:0];
            [context deleteObject:[arr objectAtIndex:0]];
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
        @catch (NSRangeException *exception) {
            // Something was out of range; put your code to handle this case here
        }
    }
}

但是,如果没有应用程序其余部分的上下文,则无法判断这是否是错误。如果你尝试这个并且它不起作用,则错误在你的应用程序中更深层次