本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說(shuō)三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.
之前, 寫過(guò)幾篇關(guān)于runtime運(yùn)行時(shí)的文章:
- 利用runtime更改textField的placeholder字體顏色
- 利用runtime和KVC完成對(duì)象的序列化和反序列化
- 利用 Runtime(運(yùn)行時(shí))講解字典轉(zhuǎn)模型的核心算法
這次, 正在研究博愛寫得框架:
- 博愛微信,使用原生 frame + MVVM + MVC + QMUIKit + BAKit 開源的微信
-
一個(gè)基于 MVVM 和 MVC 設(shè)計(jì)模式的基本項(xiàng)目框架,項(xiàng)目用到的各種類,各種封裝,各種三方庫(kù)的綜合項(xiàng)目
在學(xué)習(xí)里面runtime相關(guān)的內(nèi)容的時(shí)候, 也學(xué)到了一些新的東西, 剛好也把以前的重新回憶一遍, 我理解的都是一些皮毛, 大神可以忽略啦.
之前在字典轉(zhuǎn)模型的核心算法里, 提到了如何獲取一個(gè)類屬性列表. 其實(shí), runtime不僅僅給我們提供了獲取屬性列表的方法, 同時(shí)還有獲取成員變量列表, 獲取方法列表, 獲取協(xié)議列表的方法.
其實(shí)步驟都差不多, (以獲取方法列表為例):
- 先看屬性中是否已經(jīng)保存了方法列表, 這一步主要是防止反復(fù)獲取列表, 提升性能.
NSArray *methods = objc_getAssociatedObject(self, kYFMethodsKey);
if (methods) {
return methods;
}
- 然后用
runtime里的方法獲取方法列表:
Method *cMethods = class_copyMethodList([self class], &count);
- 遍歷方法列表, 將方法轉(zhuǎn)換成OC字符串, 并添加到可變數(shù)組中:
for (unsigned int i = 0; i < count; i++) {
Method method = cMethods[i];
SEL methodSel = method_getName(method);
NSString *ocMethodName = NSStringFromSelector(methodSel);
[mtArray addObject:ocMethodName];
}
- 為屬性設(shè)置方法列表值, 并返回方法列表:
objc_setAssociatedObject(self, kYFMethodsKey, mtArray, OBJC_ASSOCIATION_COPY_NONATOMIC);
return objc_getAssociatedObject(self, kYFMethodsKey);
利用運(yùn)行時(shí)獲取的屬性列表, 成員變量列表有什么用呢?
我們可以修改系統(tǒng)沒(méi)有公開的一些屬性:
比如UIAlertController, 默認(rèn)的ActionAlert模式是這樣的:

但是, 如果我們想修改它的顏色怎么辦呢?
我們可以先打印出UIAlertController的屬性列表:

我們發(fā)現(xiàn)屬性很多, 但是有兩個(gè)屬性引起了我們的注意:
attributedTitle和attributedMessage
我們可以將標(biāo)題和信息的文本設(shè)置成富文本, 然后用KVC的方式設(shè)置給這兩個(gè)屬性:
然后我添加了這樣一段代碼:
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@"哈哈哈" attributes:@{
NSForegroundColorAttributeName : [UIColor brownColor],
}];
[alertVc setValue:attrStr forKey:@"attributedTitle"];
NSMutableAttributedString *msgAttrStr = [[NSMutableAttributedString alloc] initWithString:@"用這種方式設(shè)置信息真的好嗎?" attributes:@{
NSForegroundColorAttributeName : [UIColor redColor],
NSFontAttributeName : [UIFont boldSystemFontOfSize:14],
}];
[alertVc setValue:msgAttrStr forKey:@"attributedMessage"];
成功覆蓋掉了之前的原始文本, 將我們需要的效果呈現(xiàn)了出來(lái):

但是, 確定按鈕和取消按鈕的顏色應(yīng)該如何設(shè)置呢?
這時(shí),我們打印UIAlertAction的成員變量列表, 發(fā)現(xiàn)了有這么個(gè)變量_titleTextColor

這應(yīng)該就是我們需要的, 于是我加上了這樣兩句代碼:
[cancelAction setValue:[UIColor cyanColor] forKey:@"_titleTextColor"];
[confirmAction setValue:[UIColor orangeColor] forKey:@"_titleTextColor"];
發(fā)現(xiàn), 真的設(shè)置成功了:

關(guān)于runtime的分類和這個(gè)小demo, 歡迎大家下載:
下載鏈接(密碼: vxj6)