#import <objc/runtime.h>
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// 利用runtime来替换展现弹出框的方法
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method presentM = class_getInstanceMethod(self.class, @selector(presentViewController:animated:completion:));
Method presentSwizzlingM = class_getInstanceMethod(self.class, @selector(ox_presentViewController:animated:completion:));
// 交换方法实现
method_exchangeImplementations(presentM, presentSwizzlingM);
});
}
// 自己的替换展示弹出框的方法
- (void)ox_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {// 要弹出的是UIAlertController
// 输出到控制到可以发现两者都是null
NSLog(@"title : %@",((UIAlertController *)viewControllerToPresent).title);
NSLog(@"message : %@",((UIAlertController *)viewControllerToPresent).message);
// 换图标时的提示框的title和message都是nil,由此可特殊处理
UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;
if (alertController.title == nil && alertController.message == nil) {// 是换图标的提示
return;
} else {// 其他提示还是正常处理
[self ox_presentViewController:viewControllerToPresent animated:flag completion:completion];
return;
}
}
// 其他的弹出还是正常处理
[self ox_presentViewController:viewControllerToPresent animated:flag completion:completion];
}
复制代码
转载于:https://juejin.im/post/5a31d577f265da432652d7b0