gpt4 book ai didi

iphone - 关于 Objective-C/Cocoa 键值编码和数组

转载 作者:行者123 更新时间:2023-12-03 20:39:12 25 4
gpt4 key购买 nike

我正在尝试找出“正确”的方法来处理用 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 的文档:

基本上与你的类(class):

@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 消息并使用您刚刚定义的方法与实际数组进行交互。

关于iphone - 关于 Objective-C/Cocoa 键值编码和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/494085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com