利用RunTime拦截Alert

- (void)viewDidLoad {
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    [self runtimeReplaceAlert];
}
    
// 利用runtime来替换展现弹出框的方法
- (void)runtimeReplaceAlert {
    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]]) {
        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];
}

猜你喜欢

转载自blog.csdn.net/weixin_40287666/article/details/81130047