2012-11-02 3 views
0

삭제할 수있는 행이있는 테이블 뷰가 있습니다. 테이블 뷰를 채우는 데이터는 NSMutableArray에 저장됩니다. 한 행의 데이터를 삭제하려면 내가 전화 :NSMutableArray removeObjectAtIndex가 두 번째 실행시 충돌합니다.

- (void)deleteFromArray:(NSUInteger) number{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //load NSUserDefaults 
    NSMutableArray *storedArray = [[ NSMutableArray alloc] init]; 
    storedArray = [prefs objectForKey: @"mydata"]; 
    [storedArray removeObjectAtIndex:number]; 

    [prefs setObject:storedArray forKey:@"mydata"]; 
    [storedArray release]; 
    [prefs synchronize]; 

} 

이 처음 내가 행을 삭제 잘 작동

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     subscribe *subscribeclass = [subscribe alloc]; 
     [subscribeclass deleteFromArray: indexPath.row]; 
     [myTableView reloadData]; 
    } 
} 

에서. 하지만 초를 삭제하면 deleteFromArray의 다음 줄에서 응용 프로그램이 충돌합니다.

[storedArray removeObjectAtIndex:number]; 

어떤 아이디어가 있습니까?

+1

무엇 충돌 말한다 않습니다 개체를 변경할 경우에도, 그것은

불변 그래서 그 대신

NSMutableArray *storedArray = [[ NSMutableArray alloc] init]; storedArray = [prefs objectForKey: @"mydata"]; 

시도의로 저장됩니다? – Peres

+0

'- [__ NSCFArray removeObjectAtIndex :] : 변하기 쉬운 메소드가 불변 객체' – PonySlays

+0

에 전송되었습니다. 'storedArray'가 NSArray이므로 분명히 그 메소드를 호출 할 수 없습니다. – Peres

답변

5

NSUserDefaults에서 오는 배열은 NSArray가 아니라 NSArray입니다. 이처럼 당신의 코드를 수정해야합니다

- (void)deleteFromArray:(NSUInteger) number{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //load NSUserDefaults 
    NSMutableArray *storedArray = [[prefs objectForKey:@"mydata"] mutableCopy]; 
    [storedArray removeObjectAtIndex:number]; 

    [prefs setObject:storedArray forKey:@"mydata"]; 
    [storedArray release]; 
    [prefs synchronize]; 
} 

이것은 불변의 배열의 복사본을 생성하고 수정할 수 있도록, 그것을 변경할 수 있습니다.

1

변경 불가능한 NSArrays 만 기본값으로 저장할 수 있습니다.

[NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]]; 
관련 문제