前言
最近完成app小版本迭代,在论坛看见某个求职贴写着熟练使用Method Swizzling技能
,想起15年有阵各种关于iOS黑科技
技术贴满天飞,自己也看了些,但是好像实际开发中也确实用的很少(可能确实比较菜🤣)。于是趁着这阵不忙实践一下,第一个就想到夜间模式这个功能用Method Swizzling
实现比较合适,相信也是很多开发者第一选择吧,写了个简单demo后发现确实省事儿。
效果图
动图
常用的视图控件继承关系图
实现思路
本文关于夜间模式功能的实现用到了Category
、Method Swizzling
、Notification
三个特性,具体步骤大致是新建UIView
分类,重载+(void)load
方法,在重载方法里面替换掉UIView
两个实例化方法(initWithFrame:
、initWithCoder:
)的,添加接收夜间模式开关的通知,收到通知后根据具体类更新各自UI。
在重载方法load
中替换UIView
两个实例化方法
1 | + (void)load { |
利用Method Swizzling
替换实现
1 | + (void)exchangeInitWithCoderMethod { |
在替换方法中注册接收夜间模式开关状态的通知
1 | - (instancetype)nm_initWithCoder:(NSCoder *)coder{ |
外部发送通知,视图自动更新对应状态的UI
1 | - (IBAction)lightSwitchAction:(UISwitch *)sender { |
总结
实现起来不是很难,Method Swizzling
实现类似需求确实有奇效,不过具体项目中还没使用过,有什么坑也就不清楚了,看了关于Method Swizzling
几篇文章,褒贬不一。个人认为这类黑科技的使用看具体情况吧,团队开发中肯定是要避免滥用的(不要只是为了秀),其他就不发表看法了,毕竟没资质🤣。
其实,关于Method Swizzling
的那段代码我是copy
的,后面如果有使用这项技术,我还是会回来copy
下,毕竟不常用🤣。