0

削除できる行数を含むテーブルビューがあります。テーブルビューに入力されるデータは、NSMutableArray に格納されます。1 行のデータを削除するには、次のように呼び出します。

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

理由はありますか?

4

3 に答える 3

5

NSUserDefaults からの配列は、NSMutableArray ではなく 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];
}

これにより、変更できない配列のコピーが作成され、変更できるようになります。

于 2012-11-02T15:40:57.173 に答える
1

不変の NSArray のみをデフォルトで保存できるもの。オブジェクトがミュータブルであっても、イミュータブルとして保存されます

だから代わりに

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

試す:

 [NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]];
于 2012-11-02T15:43:36.753 に答える
0

問題は、objectForKey から返される配列が不変であることです。他の人が何をしているかを見ることができます:カスタムオブジェクトを NSUserDefaults の NSMutableArray に保存

于 2012-11-02T15:41:14.180 に答える