-->

'NSRangeException',原因是: '* - [__ NSA

2019-10-17 10:22发布

我想删除一些项目,但我收到此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];

}}

任何人都可以帮助吗?

Answer 1:

你不能从你迭代通过一个数组中删除的对象。
有可能是你几种解决方案。

一种方法是使用一个额外的可变数组,将认为应删除的所有对象,然后遍历它,并删除原始阵列的对象:

-(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];
    }
}

编辑
修正了NSIndexPathNSString在第二次迭代由于蒂亚戈的建议。



Answer 2:

你需要做的缺失反向行顺序。 比方说,你有3行,你想在索引0和2删除行。

如果你在索引0删除该行第一,那么当你尝试在指数2删除的行,它崩溃,因为现在只有2左行。

如果您在索引2删除该行第一,然后指数0,一切都会好的。



文章来源: 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'