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後直接編寫以上兩部分代碼,那麼就應該成功了