2016-06-18 12 views
1

私は、ユーザーから定義されたデータでいっぱいのテーブルビューを持っています。アレイはnsuserdefaultsから収集され、テーブルビューコントローラに表示されます。私は削除機能を実装しようとしています。それは正常に見えるが、私はエラーを削除押すとテーブルビューのオブジェクトを削除する要素を削除します。

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

がFavourites.h

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


} 

を初期化する作品は、私のように感じます上記のコードは問題がどこにあるかです。 NSUserDefaults;私は期待NSArrayです。だから私はそれもまた変更することができますか?

だけの利益のためにdeleteメソッドのフォローアップセット

- (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からそれをロードすると、配列の変更可能なコピーを作成することです:

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

これは、Objective-Cのタイプのシステムの中で最も混乱の1つです。システムでNSMutableArray変数に何かを割り当てることができる場合は、NSMutableArrayでなければならないと思っています(Swiftでは正しいでしょう)。しかし、はObjCでこれのという保証は全くありません。構文によって、静的に型付けされたように見えますが、そうではありません。

関連する問題