本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java
, 数据结构与算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 联系微信tsaievan
.
之前, 写过几篇关于runtime
运行时的文章:
这次, 正在研究博爱写得框架:
- 博爱微信,使用原生 frame + MVVM + MVC + QMUIKit + BAKit 开源的微信
-
一个基于 MVVM 和 MVC 设计模式的基本项目框架,项目用到的各种类,各种封装,各种三方库的综合项目
在学习里面runtime
相关的内容的时候, 也学到了一些新的东西, 刚好也把以前的重新回忆一遍, 我理解的都是一些皮毛, 大神可以忽略啦.
之前在字典转模型的核心算法里, 提到了如何获取一个类属性列表. 其实, runtime
不仅仅给我们提供了获取属性列表的方法, 同时还有获取成员变量列表, 获取方法列表, 获取协议列表的方法.
其实步骤都差不多, (以获取方法列表为例):
- 先看属性中是否已经保存了方法列表, 这一步主要是防止反复获取列表, 提升性能.
NSArray *methods = objc_getAssociatedObject(self, kYFMethodsKey);
if (methods) {
return methods;
}
- 然后用
runtime
里的方法获取方法列表:
Method *cMethods = class_copyMethodList([self class], &count);
- 遍历方法列表, 将方法转换成OC字符串, 并添加到可变数组中:
for (unsigned int i = 0; i < count; i++) {
Method method = cMethods[i];
SEL methodSel = method_getName(method);
NSString *ocMethodName = NSStringFromSelector(methodSel);
[mtArray addObject:ocMethodName];
}
- 为属性设置方法列表值, 并返回方法列表:
objc_setAssociatedObject(self, kYFMethodsKey, mtArray, OBJC_ASSOCIATION_COPY_NONATOMIC);
return objc_getAssociatedObject(self, kYFMethodsKey);
利用运行时获取的属性列表, 成员变量列表有什么用呢?
我们可以修改系统没有公开的一些属性:
比如UIAlertController
, 默认的ActionAlert模式是这样的:
但是, 如果我们想修改它的颜色怎么办呢?
我们可以先打印出UIAlertController
的属性列表:
我们发现属性很多, 但是有两个属性引起了我们的注意:
attributedTitle
和attributedMessage
我们可以将标题和信息的文本设置成富文本, 然后用KVC的方式设置给这两个属性:
然后我添加了这样一段代码:
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@"哈哈哈" attributes:@{
NSForegroundColorAttributeName : [UIColor brownColor],
}];
[alertVc setValue:attrStr forKey:@"attributedTitle"];
NSMutableAttributedString *msgAttrStr = [[NSMutableAttributedString alloc] initWithString:@"用这种方式设置信息真的好吗?" attributes:@{
NSForegroundColorAttributeName : [UIColor redColor],
NSFontAttributeName : [UIFont boldSystemFontOfSize:14],
}];
[alertVc setValue:msgAttrStr forKey:@"attributedMessage"];
成功覆盖掉了之前的原始文本, 将我们需要的效果呈现了出来:
运行效果但是, 确定按钮和取消按钮的颜色应该如何设置呢?
这时,我们打印UIAlertAction
的成员变量列表, 发现了有这么个变量_titleTextColor
这应该就是我们需要的, 于是我加上了这样两句代码:
[cancelAction setValue:[UIColor cyanColor] forKey:@"_titleTextColor"];
[confirmAction setValue:[UIColor orangeColor] forKey:@"_titleTextColor"];
发现, 真的设置成功了:
运行效果关于runtime
的分类和这个小demo, 欢迎大家下载:
下载链接(密码: vxj6)
网友评论