引言
KVC帮助我们实现了很多原本难以实现的事情,比如改变AlertAction的字体颜色,大小等,但是在不同的iOS版本中,Key值也会发生改变,所以我们在赋值之前应该先做出判断是key是否存在,不然很可能就会因为使用了无效key而看见如下的提示
this class is not key value coding-compliant for the key ***.
不过可惜的是,iOS并没有直接提供contain这种方法来判断,所以我们只能自行去获取
如果你是用的字典这种常见的类型,那么恭喜你,可以直接通过valueForKey来判断是否存在值即可,但是如果他是一个NSObjc对象呢?比如UIAlertAction?如果你直接使用valueForKey,那么恭喜你,会和setValueForKey一样,抛出上图的异常
解决方法:
根据OC的动态特性,利用Runtime去解决这个问题,查找他的ivars中是否存在这个key,从而达到曲线救国的目的
代码
- (BOOL)key:(NSString *)key existInClass:(Class)metaClass{ unsigned int count = 0; BOOL exist = NO; Ivar *ivars = class_copyIvarList(metaClass, &count); for (int i = 0; i < count; i++) { Ivar ivar = ivars[i]; NSString *keyName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding]; if ([keyName rangeOfString:key].length>0) { exist = YES; } } return exist; }
感谢阅读这篇文章,转载请注明出处.