2016-11-17 5 views
1

Я ищу способ расширить реализацию функции viewWillAppear из класса UIViewController, чтобы заставить его печатать имя класса представления, называемого каждый раз, когда вызывается эта функция.Могу ли я расширить viewWillAppear в UIViewController?

Я знаю, что переопределить функции в расширениях невозможно, поэтому я задаюсь вопросом, есть ли способ сделать что-то подобное.

ответ

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)") 
} 
} 
Смежные вопросы