首页投稿(暂停使用,暂停投稿)

还在愁一进公司不知道当前页面的 控制器是哪个嘛? runtim

2016-05-18  本文已影响153人  马爷

首先 第一个 就是创建一个 UIviewcontroller 的分类
其次就是

+ (void)load
{
//方法交换应该被保证 在程序中只能执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //获取 viewcontroller 的生命周期方法
    SEL systemMethod = @selector(viewWillAppear:);
    SEL systemMethodDis = @selector(viewWillDisappear:);
    //自己实现将要交换的方法
    SEL changeMethod = @selector(statistics_viewWillAppear);
    SEL changeMethodDis = @selector(statistics_viewWillDisappear);
    
    //来个方法的 method
    Method system = class_getInstanceMethod([self class], systemMethod);
    Method change = class_getInstanceMethod([self class], changeMethod);
    
    Method systemDis = class_getInstanceMethod([self class], systemMethodDis);
    Method changeDis = class_getInstanceMethod([self class], changeMethodDis);
    
    //首先动态添加方法 实现是被交换的方法 返回值表示成功或者失败
    BOOL isAdd = class_addMethod(self, systemMethod, method_getImplementation(change), method_getTypeEncoding(change));
    if (isAdd) {
        //如果成功 说明类中不存在这个方法的实现
        //将被交换方法的实现替换到这个并不存在的实现
        class_replaceMethod(self, changeMethod, method_getImplementation(system), method_getTypeEncoding(system));
    } else {
        //交换来个方法的实现
        method_exchangeImplementations(system, change);
    }
    
    
    BOOL isDis = class_addMethod(self, systemMethodDis, method_getImplementation(changeDis), method_getTypeEncoding(changeDis));
    if (isDis) {
        class_replaceMethod(self, changeMethodDis, method_getImplementation(systemDis), method_getTypeEncoding(systemDis));
    } else {
        method_exchangeImplementations(systemDis, changeDis);
    }
    
});
}

- (void)statistics_viewWillAppear
{
    NSLog(@"看我现在  进去  那个类了 %@", [self class]);
}

- (void)statistics_viewWillDisappear
{
    NSLog(@"看我现在  出去  这个类了 %@", [self class]);
}
上一篇下一篇

猜你喜欢

热点阅读