1
我正在尋找一種方法來擴展從UIViewController類的函數viewWillAppear的實現,使其打印每次調用此函數時調用的視圖的類名稱。我可以在UIViewController中擴展viewWillAppear嗎?
我知道這是不可能覆蓋擴展中的函數,所以我想知道是否有任何方式來做這樣的事情。
我正在尋找一種方法來擴展從UIViewController類的函數viewWillAppear的實現,使其打印每次調用此函數時調用的視圖的類名稱。我可以在UIViewController中擴展viewWillAppear嗎?
我知道這是不可能覆蓋擴展中的函數,所以我想知道是否有任何方式來做這樣的事情。
好的,在找到這個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)")
}
}