2012-11-02 52 views
0

我有一個數字,我希望能夠刪除行的實現代碼如下。填充tableview的數據存儲在一個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

是什麼崩潰說? – Peres

+0

「 - [__ NSCFArray removeObjectAtIndex:]:發送到不可變對象變異方法」 – PonySlays

+0

顯然你'storedArray'是'NSArray',這就是爲什麼你不能調用方法。 – Peres

回答

5

數組從您的到來NSUserDefaults的是NSArray的,而不是一個NSMutableArray。你應該修改你的代碼是這樣的:

- (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 *storedArray = [[ NSMutableArray alloc] init]; 
storedArray = [prefs objectForKey: @"mydata"]; 

嘗試:

[NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]]; 
相關問題