iPhoneアプリのキー値コーディングを使用して配列にデータを入力する「正しい」方法を見つけようとしています。私はうまくいくものを思いつきましたが、それはかなりハックです。基本的に、私は XML ドキュメントを一連のコード生成モデルに解析しています。XML が次の形式であるとします。
<foo>
<bar>
<item name="baz" />
<item name="bog" />
</bar>
</foo>
Bar 要素を表す生成されたオブジェクトでは、サブノード用に定義された NSMutableArray があります。
@interface Bar : NSObject {
NSMutableArray *item;
}
@end
したがって、デフォルトでは、Bar のインスタンスで setValue:forKey: を呼び出すと、NSMutableArray のインスタンスが Item オブジェクトの単一のインスタンスで上書きされます。これを機能させるために私が現在行っていることは、ハッキーになるところです。配列インスタンス変数の名前を別のものに変更しました。名前の複数形を考えてみましょう:
@interface Bar : NSObject {
NSMutableArray *items;
}
@end
これにより、setValue:forKey: のデフォルトのアクセサーが失われます。次に、このメソッドを Bar 実装に追加しました。
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if([key isEqualToString:@"item"]) {
if(items == nil) {
items = [[NSMutableArray alloc] init];
[items retain];
}
[items addObject:value];
}
}
そして、すべてが機能します!しかし、これを行うためのより良い方法があるに違いないと確信しています! Key-Value Coding Programming Guide を読みましたが、配列アクセサーがどのように機能するかがよくわからないため、何かが欠けているに違いありません。countOf: と objectInAtIndex: を KVC プログラミング ガイドが示すように実装しようとしましたが、それでも NSMutableArray が Item タイプのインスタンスで上書きされます。