2012-05-11 7 views
0

私はグローバルなNSMutableArrayを持っており、値で更新する必要があります。 NSMutableArrayは.hで次のように定義されています。xcode update NSMutableArray

@property (strong, nonatomic) NSMutableArray *myDetails; 

このようなviewDidLoad事前設定では、ユーザーがテキストフィールドを変更したとき

NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"1", @"rowNumber", @"125", @"yards", nil]; 
    NSDictionary *row2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"2", @"rowNumber", @"325", @"yards", nil]; 
    NSDictionary *row3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"3", @"rowNumber", @"525", @"yards", nil]; 
self.myDetails = [[NSMutableArray alloc] initWithObjects:row1, row2, row3, nil]; 

は、このコードは、これを実行されます。

-(void)textFieldDidEndEditing:(UITextField *)textField{ 
    NSObject *rowData = [self.myDetails objectAtIndex:selectedRow]; 

    NSString *yards = textField.text; 

    [rowData setValue:yards forKey:@"yards"]; 

    [self.myDetails replaceObjectAtIndex:selectedRow withObject:rowData]; 
} 

[rowData setValue:yards forKey:@ "yards"];行のコードをステップ実行するとき。このエラーを返します。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 

答えて

2

配列は可変ですが、その内容は... NSDictionary ...ではありません。配列の

[rowData setValue:yards forKey:@"yards"]; 

オブジェクトは、あなたが変更しているものです...あなたは...配列のうち、

NSObject *rowData = [self.myDetails objectAtIndex:selectedRow]; 

をオブジェクトを取得し、その後、そのオブジェクトを変異してみてください...それはNSDictionary、不変です、あなたはそれを変更することはできません。辞書を変更できるようにするには、NSMutableDictionaryを使用する必要があります。

+0

Jodyは正しいですが、すでに配列内にある辞書を変更しようとしています。私はそれを自分自身に置き換えているので、 "置き換え"を引用符で囲みます。変更可能な辞書を使用して、 '-replaceObjectAtIndex:withObject:'への呼び出しを破棄するか、配列内の不変な辞書を使い続けることもできますが、新しい辞書を作成して置換ロジックを保持することができます。 –

+0

お互いに感謝しています。私はもう一度やり直したくないのです! – Xaphann