1、经过运用runtime 查找uidatepicker的所调用的方法php
小编工做时候遇到了要更改UIDatePicker 文字的需求,当时我就懵了,由于datepicker系统默认的文字颜色为黑色,而个人需求是将其文字颜色,改成白色,极为麻烦的是datepicker 没有直接的属性对其进行修改。所以我想到了runtime的运用,经过利用runtime,将datepicker 所调用的方法所有找出,最后发现了@“textcolor”这一方法 代码以下:
html
unsigned int outCount;
app
int i;
objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount);
for (i = outCount -1; i >= 0; i--)
{
// 循环获取属性的名字 property_getName函数返回一个属性的名称函数
NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty[i]) encoding:NSUTF8StringEncoding];字体
NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty[i]) encoding:NSUTF8StringEncoding];
ui
if([getPropertyName isEqualToString:@"textColor"])
{
[picker setValue:[UIColor whiteColor] forKey:@"textColor"];
}
NSLog(@"%@====%@",getPropertyNameString,getPropertyName);
}url
经过底层C语言的方法,对@“textcolor”进行附值es5
2、经过NSInvocation 来改变选中字体的状态spa
当这一步完成时 你会发现datepicker 所选中的字体 依然是默认的黑色,而其余的地方已经变成了白色。(前提是你设置了最大值,或者设置了最小值,若是不设置应该是没有问题的)那么如今就须要用到NSInvocation(NSInvocation也是runtime中的一种方法)来进行队选中状态的附值,代码以下:
code
SEL selector = NSSelectorFromString(@"setHighlightsToday:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
BOOL no = NO;
[invocation setSelector:selector];
[invocation setArgument:&no atIndex:2];
[invocation invokeWithTarget:picker];
如下为每一步代码的应用:
SEL selector =NSSelectorFromString(@”setHighlightsToday:”);
经过Runtime的NSSelectorFromString利用字符串获取方法@”setHighlightsToday:”(注意,看这个方法名就是今天的高亮显示开关,注意字符串后面的冒号,表示这个方法是有参数的)
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
用这个SEL建立UIdatepicker类的NSMethodSignature来建立一个NSInvocation。
BOOL no = NO;
[invocation setSelector:selector];
[invocation setArgument:&no atIndex:2];
[invocation invokeWithTarget:picker];
给invocation设置参数,设置target,而且动态调用设置参数NO(苹果默认YES而且不开放)
其实NSInvocation也是Runtime的一种方式。
注意[invocation setArgument:&no atIndex:2];这个2是怎么来的,由于setArgument中第一个参数的类picker,第二个参数是SEL,因此咱们本身的参数最小的数字就是2,也就是这个方法的第一个参数 能够确定的是这个 2 是一个定数 若是为1 则程序运行 会报错
3、若是你看到这里,只能说明你尚未达成目的,那究竟是哪里出了问题呢?
若是尚未成功,那你必定是将前两补的代码放在了有关datepicker代码的后面,上面说了若是设置了最大值或者最小值,则系统直接默认为黑色,应在设置最大值,跟最小值以前编写以上两部分代码。
最好是在生成datepicker后直接编写以上两部分代码,那么就应该成功了