1

我正在尝试删除一些项目,但我收到了这个 NSException:

'NSRangeException',原因:' * -[__NSArrayM objectAtIndex:]:索引 2 超出范围 [0 .. 1]'

这是我的代码:

-(void)deletePressed:(id)sender {

if (data.count > 0) {

    NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Galeria/"];

    NSFileManager *manager = [NSFileManager defaultManager];

    for (NSIndexPath *indexPath in itensSelecionados) {

        NSString *result = [path stringByAppendingFormat:@"%@", [[manager contentsOfDirectoryAtPath:path error:nil] objectAtIndex:indexPath.row]];

        [manager removeItemAtPath:result error:nil];

    }

    [self viewWillAppear:YES];

}}

任何人都可以帮忙吗?

4

2 回答 2

2

您不能从正在迭代的数组中删除对象。
可能有几个解决方案适合您。

一种是使用一个额外的可变数组来保存所有应该删除的对象,然后遍历它并从原始数组中删除对象:

-(void)deletePressed:(id)sender {
    if (data.count > 0) {
        NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Galeria/"];
        NSFileManager *manager = [NSFileManager defaultManager];
        NSMutableArray *filesToDelete = [NSMutableArray array];

        // Build a list of files to delete
        for (NSIndexPath *indexPath in itensSelecionados) {
            NSString *result = [path stringByAppendingFormat:@"%@", [[manager contentsOfDirectoryAtPath:path error:nil] objectAtIndex:indexPath.row]];
            [filesToDelete addObject:result];
        }

        // Actually delete the files
        for (NSString *indexPathString in filesToDelete) {
            [manager removeItemAtPath:indexPathString error:nil];
        }

        // Why do you call viewWillAppear directly ??
        [self viewWillAppear:YES];
    }
}

编辑由于蒂亚戈的建议,在第二次迭代中
修复了NSIndexPathto 。NSString

于 2012-11-18T21:09:45.017 回答
0

您需要以相反的行顺序进行删除。假设您有 3 行,并且您想删除索引 0 和 2 处的行。

如果您先删除索引 0 处的行,那么当您尝试删除索引 2 处的行时,它会崩溃,因为现在只剩下 2 行了。

如果先删除索引 2 处的行,然后删除索引 0,一切都会好起来的。

于 2012-11-18T21:02:45.763 回答