2016-06-18 28 views
1

我有一個表視圖充滿了用戶定義的數據。該數組從nsuserdefaults收集並顯示在表視圖控制器中。我正在嘗試實現刪除功能。它看起來很好,但是當我按下刪除錯誤出現刪除元素從表視圖目標c

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 

然後一塊其中i初始化

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

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


} 

我覺得像上面的代碼是問題所在。 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"]返回的是NSArray而不是NSMutableArray

的解決方案是創建數組的一個可變副本,當你從NSUserDefaults加載:

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

這是Objective-C的類型系統中最令人困惑的問題之一。你自然會認爲,如果系統允許你爲NSMutableArray變量賦值,那麼它必須是NSMutableArray(在Swift中,你是對的)。但是在ObjC中有絕對沒有保證 - 語法使得語言看起來像是靜態類型的,但事實並非如此。