2016-06-18 1 views
1

사용자가 정의한 데이터로 가득 찬 테이블보기가 있습니다. 배열은 nsuserdefaults에서 수집되고 테이블 뷰 컨트롤러에 표시됩니다. 나는 삭제 기능을 구현하려고합니다. 그것을 잘 보이지만 삭제 누를 때 오류가테이블 뷰에서 요소를 삭제하십시오. 대상 코드 :

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 

내가 그런

#import <UIKit/UIKit.h> 

@interface FavoritesViewController: UITableViewController <UITableViewDelegate, UITableViewDataSource> 
@property(nonatomic, strong) IBOutlet UITableView *tableView; 
@property (nonatomic,strong) NSMutableArray *favoriteItems; 

@end 

나는 기분이 내가

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

favoriteItems= [[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]; 
[self.tableView reloadData]; 


} 

를 초기화 조각 Favourites.h

에 대해 가지고있는 코드를 제공 위의 코드는 문제가있는 곳입니다. NSUserDefaults; 기대하는 NSArray입니다. 그래서 나는 그것도 너무 변경할 수 있습니까?

그냥 이익을 위해 삭제 방법

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
    //remove the deleted object from your data source. 
    //If your data source is an NSMutableArray, do this 
    [self.favoriteItems removeObjectAtIndex:indexPath.row]; 
    [[NSUserDefaults standardUserDefaults] setObject:favoriteItems forKey:@"favoritesArray"]; 
    [self.tableView reloadData]; // tell table to refresh now 
    } 
} 

까지 다음 세트는 정말 사전에 도움을 주셔서 감사합니다.

답변

2

[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]NSMutableArray이 아닌 NSArray을 반환하는 것이 문제입니다.

[[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"] mutableCopy];

이 목표 - C의 타입 시스템의 가장 혼란스러운 부분 중 하나입니다 : 당신이 NSUserDefaults에서로드 할 때

이 솔루션은 배열의 변경 가능한 사본을 만드는 것입니다. 시스템에서 어떤 변수를 NSMutableArray 변수에 할당 할 수 있다고 생각한다면 당연히 NSMutableArray이어야합니다 (스위프트에서는 맞을 것입니다). 그러나 ObjC에서이 중을 절대적으로 보장하지 않습니다. 구문에 따라 언어가 정적으로 형식화 된 것처럼 보이지만 그렇지 않습니다.

관련 문제