我将尝试在Swift 3中实现方法交换,基于这个回答:How to implement method swizzling swift 3.0?
以下是我的代码:
当应用程序启动时,它会崩溃,并显示以下原因:
我尝试在 swizzling(self) 之前放置断点,并且它在UIView上被调用了一次,正如预期的那样。
// MARK: - Swizzling
private let swizzling: (UIView.Type) -> () = { view in
let originalSelector = #selector(view.awakeFromNib)
let swizzledSelector = #selector(view.swizzled_localization_awakeFromNib)
let originalMethod = class_getInstanceMethod(view, originalSelector)
let swizzledMethod = class_getInstanceMethod(view, swizzledSelector)
method_exchangeImplementations(originalMethod, swizzledMethod)
}
extension UIView {
open override class func initialize() {
guard self === UIView.self else {
return
}
swizzling(self)
}
func swizzled_localization_awakeFromNib() {
swizzled_localization_awakeFromNib()
if let localizableView = self as? Localizable {
localizableView.localize()
}
}
}
当应用程序启动时,它会崩溃,并显示以下原因:
我无法理解为什么在UINavigationController上调用了 swizzled_localization_awakeFromNib。我正在使用obj-c项目,这可能是原因吗?在swift 2中通过dispatch_once运行良好。'-[UINavigationController swizzled_localization_awakeFromNib]: unrecognized selector sent to instance 0x7fc7c8820400'
我尝试在 swizzling(self) 之前放置断点,并且它在UIView上被调用了一次,正如预期的那样。