extension UIViewController {
//通过运行时替换系统的present方法
public class func zxxPReplaceSystemP(){
letsystemSelector =#selector(UIViewController.present(_:animated:completion:))
letzxxSelector =#selector(UIViewController.zxx_present(_:animated:completion:))
letsystemMethod =class_getInstanceMethod(self, systemSelector)
letzxxMethod =class_getInstanceMethod(self, zxxSelector)
//先进行判断一下原有类中是否有要替换方法的实现
letdidAddMethod:Bool=class_addMethod(self, systemSelector,method_getImplementation(zxxMethod!),method_getTypeEncoding(zxxMethod!))
ifdidAddMethod {
class_replaceMethod(self, zxxSelector, method_getImplementation(systemMethod!), method_getTypeEncoding(systemMethod!))
}else{
method_exchangeImplementations(systemMethod!, zxxMethod!)
}
}
@objcpublicfunczxx_present(_viewControllerToPresent:UIViewController, animated flag:Bool, completion: (() ->Void)? =nil) {
ifviewControllerToPresent.isKind(of:UIAlertController.classForCoder()) {
letalertController = viewControllerToPresentas?UIAlertController
ifalertController?.title==nil&&alertController?.message==nil{
return
}else{
self.zxx_present(viewControllerToPresent, animated: flag)
return
}
}
self.zxx_present(viewControllerToPresent, animated: flag)
}
}
网友评论