2012-11-18 2 views
1

나는 일부 항목을 삭제하기 위해 노력하고있어하지만 난이 NSException 수신 해요 :'NSRangeException'이유 : '* - [__ NSArrayM objectAtIndex :] : 범위를 넘는 인덱스 2 [0 .. 1]'

를 ' 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]; 

}} 

누구든지 도울 수?

답변

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

편집
고정 :

하나는 삭제해야 모든 개체를 보유하고 그것을 통해 반복하고 원래의 배열에서 개체를 제거 할 추가 변경 가능한 배열을 사용하는 것입니다 NSIndexPath에서 NSString으로 두 번째 반복에서 Thiago의 조언으로 인해.

+0

고마워요,하지만 코드에서 수정해야합니다. 두 번째 forin은 다음과 같습니다. for (NSString * stringToDelete in filesToDelete) { [manager removeItemAtPath : stringToDelete error : nil]; } 내가 viewWillAppear을 호출합니다. 탭을 선택할 때마다 해당 테이블을 다시로드해야합니다. –

+0

정답을 제공해 주셔서 감사합니다 - 정답입니다. –

+0

나는'viewWillAppear'를 직접 호출해서는 안된다고 생각한다. 당신은 더 나은 방법에서 다른 코드로 이동하고 두 곳에서 전화 ... –

0

역순으로 삭제해야합니다. 3 행이 있고 인덱스 0과 2의 행을 삭제한다고 가정 해 보겠습니다.

인덱스 0의 행을 먼저 삭제하면 인덱스 2의 행을 삭제하려고하면 인덱스 2의 행을 삭제하려고 할 때 충돌이 발생합니다 단지 2 줄이 남았습니다.

인덱스 2의 행을 먼저 삭제 한 다음 인덱스 0을 삭제하면 모든 항목이 정상적으로됩니다.

관련 문제