字典转模型 KVC 实现
- KVC 字典转模型弊端:必须保证,模型中的属性和字典中的
key
一一对应。 - 如果不一致,就会调用
[<Status 0x7fa74b545d60> setValue:forUndefinedKey:]
报key
找不到的错。 - 分析:模型中的属性和字典的
key
不一一对应,系统就会调用setValue:forUndefinedKey:
报错。 - 解决:重写对象的
setValue:forUndefinedKey:
,把系统的方法覆盖,就能继续使用KVC,字典转模型了。
一: 如果你不想用第三方控件,感觉自由度太低,比较受限制,那么可以尝试这种方法,使用 KVC 机制的 如下方法
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
二: 有的时候我们需要将字典里的数据类型转成我们模型需要的类型可以在-(void)setValue:(id)value forKey:(NSString *)key将value转换一下
// 将所有的Number数据类型转换为字符串
- (void) setValue:(id)value forKey:(NSString*)key{
if ([value isKindOfClass:[NSNull class]]) {
value=nil;
} else if ([value isKindOfClass:[NSArrayclass]]) {
} else {
value = [NSStringstringWithFormat:@"%@",value];
}
[supersetValue:value forKey:key];
}
// 对特殊字符 id 进行处理
- (void) setValue:(id)value forUndefinedKey:(NSString*)key {
NSLog(@"Undefined Key: %@", key);
}
三: 如果我们还想要进行模型里的模型嵌套,或者模型里的模型数组或者其他处理怎么办?
在EmployeModel里面复写BaseModel里面的 setValueForKey比如我的EmployeModel里面还有个times 的字典数组,数组里面又是模型,单独处理。除此之外,我们还可以进行其他的一些数据微调处理。
- (void) setValue:(id)value forKey:(NSString*)key {
if ([key isEqualToString:@"mobile"]) {
NSArray*arr = [(NSString*)value componentsSeparatedByString:@"-"];
value = [arr componentsJoinedByString:@""];
} else if ([key isEqualToString:@"times"]) {
NSMutableArray*retArr = [NSMutableArrayarray];
for (int i = 0; i < ((NSArray*)value).count; i++) {
NSDictionary* aDayTimeDic = ((NSArray*)value)[i];
TimeModel *aDayTime = [[TimeModel alloc]initWithDic:aDayTimeDic];
[retArr addObject:aDayTime];
}
value = retArr;
}
[supersetValue:value forKey:key];
}