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

主宰稳场 提交于 2019-12-11 13:27:30

问题


I'm trying to delete some items but i'm receiving this NSException:

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

Here is my code:

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

}}

Anyone could help?


回答1:


You can't remove objects from an array that you are iterating through.
There may be few solutions for you.

One is to use an additional mutable array that will hold all the objects that should be deleted and then iterate through it and remove the objects from the original array:

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

EDIT
Fixed the NSIndexPath to NSString in the second iteration due to Thiago's advise.




回答2:


You need to do the deletion in reverse row order. Lets say you have 3 rows and you want to delete the rows at index 0 and 2.

If you delete the row at index 0 first, then when you try to delete the row at index 2, it crashes because now there are only 2 rows left.

If you delete the row at index 2 first, then index 0, everything will be OK.



来源:https://stackoverflow.com/questions/13444437/nsrangeexception-reason-nsarraym-objectatindex-index-2-beyond-boun

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!