我正在尝试找出“正确”的方法来处理用 iPhone 应用程序的键值编码填充数组。我已经想出了一些可行的方法,但它相当黑客。基本上,我将 XML 文档解析为一组代码生成的模型。假设 XML 的格式如下:
<foo>
<bar>
<item name="baz" />
<item name="bog" />
</bar>
</foo>
在代表 Bar 元素的生成对象上,我为子节点定义了一个 NSMutableArray:
@interface Bar : NSObject {
NSMutableArray *item;
}
@end
因此,默认情况下,当我在 Bar 的实例上调用 setValue:forKey: 时,它最终会使用 Item 对象的单个实例覆盖 NSMutableArray 的实例。我目前为使其正常工作所做的事情是它变得棘手的地方。我将数组实例变量重命名为其他名称,比如说名称的复数形式:
@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];
}
}
一切正常!我确信一定有更好的方法来做到这一点!我已经通读了《键值编码编程指南》,但我一定错过了一些东西,因为我不清楚数组访问器应该如何工作。我已经尝试实现 countOf: 和 objectInAtIndex: 正如 KVC 编程指南似乎指出的那样,但这仍然导致我的 NSMutableArray 被 Item 类型的实例覆盖。
如果您想对数组使用 KVC 属性,您应该查看以下文档:mutableArrayValueForKey:
基本上与你的班级:
@interface Bar : NSObject {
NSMutableArray *items;
}
@end
假设您在其他地方初始化了数组,您至少可以定义这些方法:
- (void)insertObject:(id)object inItemsAtIndex:(NSUInteger)index {
[items insertObject:object atIndex:index];
}
- (void)removeObjectFromItemsAtIndex:(NSUInteger)index {
[items removeObjectAtIndex:index];
}
- (NSArray *)items {
/* depending on how pedantic you want to be
possibly return [NSArray arrayWithArray:items] */
return items;
}
一旦你实现了这些方法,你就可以调用[bar mutableArrayValueForKey:@"items"]
。它将返回一个NSMutableArray
您可以从中添加和删除对象的代理对象。该对象将依次生成适当的 KVO 消息并使用您刚刚定义的方法与实际数组进行交互。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)