设为首页 收藏本站
查看: 999|回复: 0

[经验分享] iOS 为系统方法添加自定义功能

[复制链接]

尚未签到

发表于 2017-7-5 11:31:41 | 显示全部楼层 |阅读模式
  在开发中很多时候不同的界面却需要实现相同的需求, 比如每个界面都需要改变背景色、每个界面都需要隐藏导航栏左侧item的title等等。。
  解决这种问题有很多办法, 也许你会想到继承, 但在这里我们用另一种简单的方法来不动声色的实现, 我们需要这个方法 :



/**
* Exchanges the implementations of two methods.
*
* @param m1 Method to exchange with second method.
* @param m2 Method to exchange with first method.
*
* @note This is an atomic version of the following:
*  \code
*  IMP imp1 = method_getImplementation(m1);
*  IMP imp2 = method_getImplementation(m2);
*  method_setImplementation(m1, imp2);
*  method_setImplementation(m2, imp1);
*  \endcode
*/
OBJC_EXPORT void method_exchangeImplementations(Method m1, Method m2)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
  这个方法是将两个方法的功能进行交换
  这里我们以 隐藏各个界面左侧返回键的title 为例
  解决此问题的方法 实现代码为: (这些代码我是写在一个UIViewController的category里面)



- (void)backTitleDestory_viewDidLoad
{
[self backTitleDestory_viewDidLoad]; 这里看似是自己调自己, 其实我们在上个方法里面已经将它与viewDidLoad进行了交换, 现在其实是调用的viewDidLoad
if (!self.navigationItem.title) {
self.navigationItem.title = @""; // 当title为nil时,backItem会显示“返回”
    }
self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
+ (void)replaceInstanceSelector:(SEL)originalSelector withSelector:(SEL)modifiedSelector
{
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method modifiedMethod = class_getInstanceMethod(self, modifiedSelector);
method_exchangeImplementations(originalMethod, modifiedMethod);
}
+ (void)destoryBackBarButtonItemTitle
{
[self replaceInstanceSelector:@selector(viewDidLoad) withSelector:@selector(backTitleDestory_viewDidLoad)];
}
  接下来只需在Appdelegate里面调用这个方法



- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    [UIViewController destoryBackBarButtonItemTitle];return YES;
}
  搞定!  就这样  程序就是在Appdelegate里面就已经将系统的viewDidLoad换成了我们自己写的一个方法,然后在自己的方法里面调用“自己”(其实自己的方法已经是viewDidLoad)
  这样下来效果就是在以后的每个viewDidLoad里面都添加了一些固定功能的方法
  是的 这样就在不知不觉中修改了所有界面的共同需求

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390833-1-1.html 上篇帖子: RabbitMQ官方中文入门教程(PHP版) 第二部分:工作队列(Work queues) 下篇帖子: Leetcode26--->Remove Duplicates from Sorted Array(从排序数组中移除相同的元素)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表