1

次のコードに問題があります。NSMutableDictionary 内の各配列を変更する必要があります。それらの配列を最初に辞書に追加したときは「MutableArray」ですが、何かをしようとすると「NSArray」になります。

ここに私のコードがあります:

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellText = selectedCell.textLabel.text;
    NSLog(@"cell: %@", cellText);

    Boolean flag = false;
    NSMutableDictionary *myTempDict = [[NSMutableDictionary alloc] initWithDictionary:self.tableContents copyItems:YES];

    for (NSString *key in myTempDict) 
    {
        NSLog(@"1st for");
        for(NSString *myString in [myTempDict objectForKey:key])
        {
            NSLog(@"2nd for");
            if([myString isEqualToString:cellText])
            {
                if([[myTempDict objectForKey:key] isKindOfClass:[NSMutableArray class]])
                {
                    NSLog(@"mutable");
                }
                else if([[myTempDict objectForKey:key] isKindOfClass:[NSArray class]])
                {
                    NSLog(@"not mutable");
                }
                [[myTempDict objectForKey:key] removeObject:myString];
                break;
                NSLog(@"break1");
            }
            NSLog(@"2nd for end");
        }
        if(flag)
        {
            break;
            NSLog(@"break2");
        }
    }
    self.tableContents = myTempDict;
    [tableView reloadData];

実行すると、次のエラーが生成されます。

  • セル: 12-01244476
  • 1位
  • 2位
  • 変更不可
  • -[__NSArrayI removeObject:]: 認識されないセレクターがインスタンス 0x7c02580 に送信されました
  • 現在の言語: auto; 現在、目的の c

私のviewdidLoadで、これらの配列をNSMutableArrayに作成しましたが、NSArrayに戻ったのはなぜですか? この問題に取り組む方法について何か考えはありますか?

これについて本当に助けが必要です。

ありがとう

4

1 に答える 1

3

NSDictionaryのドキュメントによると

copyWithZone: メソッドは浅いコピーを実行します。任意の深さのコレクションがある場合、 flag パラメータに YES を渡すと、サーフェスの下の最初のレベルの不変のコピーが実行されます。NO を渡すと、最初のレベルの可変性は影響を受けません。どちらの場合でも、すべてのより深いレベルの可変性は影響を受けません。

試してみませんか:

NSMutableDictionary *myTempDict = [self.tableContents mutableCopy];
于 2012-08-02T15:11:43.497 に答える