iOS hook(runtime) viewController 的 viewDidLoad 坑点

因为 项目 的 VC 比较多了,现在想统一处理背景色,想要使用 runtime 方法交换,hook viewcontrollerviewDidLoad 方法,发现设置背景色后, UINavigationpushpop 都出现了问题 ,添加控件也会有UI问题,解决后,记录下坑点

#import "UIViewController+WhiteController.h"

#import <objc/runtime.h>

@implementation UIViewController (WhiteController)

+(void)load{
    Method org_viewdidload = class_getInstanceMethod(self, @selector(viewDidLoad));
    Method new_bsviewdidload = class_getInstanceMethod(self, @selector(bsViewDidLoad));
    method_exchangeImplementations(org_viewdidload, new_bsviewdidload);
}


-(void)bsViewDidLoad{
    [self bsViewDidLoad];
    // 这两个 VC 导致出了问题
    Class inputClass = NSClassFromString(@"UIInputWindowController");
    Class editClass = NSClassFromString(@"UIEditingOverlayViewController");

    if (![self isKindOfClass:[UINavigationController class]] && ![self isKindOfClass:inputClass]&& ![self isKindOfClass:editClass]) {
        
        self.view.backgroundColor = [UIColor whiteColor];
    }
}

其实就是堆栈多了两个 Controller 如图:

WeChatb528c13b8a0605511de759d847d3beb5.png

把这两个 VC 过滤掉就可以了。在我们添加控件的时候,也要注意,什么VC 添加 UI控件,需要把不需要的过滤掉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。