0

JSONフィードの辞書の配列があります。これにより、UITableViewが入力されます。ユーザーが行を選択すると、私はUITableViewCellAccessoryCheckmarkを使用し、その行の配列内の辞書を変更しようとしているので、スクロール後にセルが再利用されたときに正しいままになります。しかし、私はエラーが発生しています。ここに私のコードは、(明確にするために短縮)です:UITableViewの行選択から配列内の辞書を更新する

JSONデータ方法:

+ (NSMutableArray *)parseKennelData:(NSString *)type userID:(NSString *)user dogID:(NSString *)dog terms:(NSString *)terms 
{ 
    NSURL *searchURL=[NSURL URLWithString:searchLocation]; 

    // download and parse the JSON 
    NSData *JSONData = [[[NSData alloc] initWithContentsOfURL:searchURL] autorelease ]; 

    NSError *error=nil; 
    CJSONDeserializer *deserializer = [CJSONDeserializer deserializer]; 
    NSMutableDictionary *JSONdictionary =[deserializer deserializeAsDictionary:JSONData error:&error]; 

    NSMutableArray *allResults = [JSONdictionary valueForKey:@"kennel"]; 

    return allResults; 
} 

ビューコントローラ:

interface 
{ 
    NSMutableArray *results; 
} 

- (void)viewDidLoad 
{ 
    // data for search 
    self.results=[JSONData parseKennelData:@"search" userID:@"demo" dogID:@"" terms:self.terms]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSMutableDictionary *rowData = [self.results objectAtIndex:[indexPath row]]; 

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (thisCell.accessoryType == UITableViewCellAccessoryNone) 
    {   
     thisCell.accessoryType = UITableViewCellAccessoryCheckmark; 
     thisCell.accessoryView = [[UIImageView alloc] 
          initWithImage:[UIImage imageNamed:@"tick-button.png"]]; 
     [rowData setObject:@"demo" forKey:@"user_id" ];   
    } 
    else 
    { 
     thisCell.accessoryType = UITableViewCellAccessoryNone; 
     thisCell.accessoryView = [[UIImageView alloc] 
           initWithImage:[UIImage imageNamed:@"plusbutton.png"]]; 
     [rowData setObject:@"" forKey:@"user_id"]; 
    } 

    [self.results replaceObjectAtIndex:[indexPath row] withObject:rowData]; 
} 

私はSIGABRTエラーを取得しています:

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

I thoug ht私はすべての私のものが変更可能であることを確かめたので、どこに落ちているのかわかりません。

おかげ

+1

は確かですその** deserializeAsDictionary **リターン変更可能な辞書? –

答えて

1

あなたはすべて自分のものは不変ことを確認したと言うが、ちょうど変更可能であるためにあなたの*JSONDictionary*allResults、および*rowDataポインタを宣言することは、それらが変更可能なことはありません。これらのオブジェクトの変更可能性は、割り当ての右側に完全に依存します。

エラーが表示されているので、didSelectRowAtIndexPath:で編集しようとしている辞書は不変です。また、私はTouchJSONに精通していないが、私はかなり確信しているallResultsも不変です。

これを修正するには、どちらの場合でも、便利なmutableCopyメソッドを使用して、変更可能な配列またはディクショナリの変更可能なコピーを作成する必要があります。

NSMutableArray *allResults = [[JSONdictionary valueForKey:@"kennel"] mutableCopy]; 

そして、tableView:didSelectRowAtIndexPath:で、それを変更する前に、辞書の可変コピーを作成します:まず、配列が可変parseKennelData:userID:dogID:terms:によって返さ作る

NSMutableDictionary *rowData = [[self.results objectAtIndex:[indexPath row]] mutableCopy]; 
+0

mutableCopyを作成して、可変オブジェクトにコピーする必要があります(例:NSMutableArray * allResults = [JSONdictionary valueForKey:@ "kennel"] mutablCopy]; –

+0

それだけでは不十分です:もしあなたがそうしたなら、 'self.results'は不変な辞書の可変配列になります。 – yuji

+1

私は、不変オブジェクトの可変コピーを例として簡単に作成する方法を示していました。私はTouchJSONを使用していないので、データがどのように戻ってくるのか本当に言えません。私はそれをより明確にすべきだった。ところで、iOS5には新しいJSON APIが用意されています。神に感謝、それはずっと延滞しています。明確化のおかげで、私は誰もを混乱させたくない、それはSOのすべてが反対であることです。 –

関連する問題