0

我创建了 NSObject 的扩展,以允许从 PLIST 或字典中包含的数据设置对象属性。我确实使用setValuesForKeysWithDictionary过,但这仅适用于键而不是 keyPaths。我的扩展做同样的事情,除了允许 PLIST 包含键路径和键。例如,detailTextLabel.text@“详细文本”作为键值对。

这很好用,除了由于 PLIST 中的拼写错误可能导致应用程序崩溃。例如,如果属性名称存在但与预期的类型不同(例如数字而不是字符串),它将崩溃。什么是最好的方法来使它更健壮和防御性地编码以避免这些类型的错误?

我已经- (void) setValue:(id)value forUndefinedKey:(NSString *)key {}在我的对象中使用来捕获 PLIST 中与实际键不对应的项目。

#pragma mark -
#pragma mark Extensions to NSObject

@implementation NSObject (SCLibrary)

- (void) setValuesForKeyPathsWithDictionary:(NSDictionary *) keyPathValues {
    NSArray *keys;
    int i, count;
    id key, value;

    keys = [keyPathValues allKeys];
    count = [keys count];
    for (i = 0; i < count; i++)
    {
        key = [keys objectAtIndex: i];
        value = [keyPathValues objectForKey: key];

        [self setValue:value forKeyPath:key];
    }
}

在此先感谢,戴夫。

4

1 回答 1

3

@try/@catch在周围添加了一个将军setValue:forKeyPath:

@try {
    [self setValue:value forKeyPath:key];
}
@catch (NSException * e) {
    NSLog(@"%@",e);
}

这确实可以防止应用程序崩溃,但是我希望找到一种在尝试设置其值之前检查选择器的方法。

如果没有更好的答案,将接受这个答案。

于 2011-08-04T10:57:45.333 回答