2016-11-17 141 views

回答

2

好的,在找到这个http://nshipster.com/swift-objc-runtime/之后,我尝试了一些类似的东西,可以达到预期的效果。

代码如下:

extension UIViewController { 
public override class func initialize() { 
    struct Static { 
     static var token: dispatch_once_t = 0 
    } 

    // make sure this isn't a subclass 
    if self !== UIViewController.self { 
     return 
    } 

    dispatch_once(&Static.token) { 
     let originalSelector = #selector(UIViewController.viewWillAppear(_:)) 
     let swizzledSelector = #selector(UIViewController.nsh_viewWillAppear(_:)) 

     let originalMethod = class_getInstanceMethod(self, originalSelector) 
     let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) 

     let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 

     if didAddMethod { 
      class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod) 
     } 
    } 
} 

// MARK: - Method Swizzling 

func nsh_viewWillAppear(animated: Bool) { 
    self.nsh_viewWillAppear(animated) 
    NSLog("viewWillAppear: \(self)") 
} 
} 
相关问题