【发布时间】:2017-02-19 08:21:03
【问题描述】:
我正在尝试根据答案 How to implement method swizzling swift 3.0? 在 swift 3 中实现方法调配
这是我的代码:
// 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]: 无法识别的选择器发送到实例 0x7fc7c8820400'
我不明白为什么 swizzled_localization_awakeFromNib 调用 UINavigationController。我在 obj-c 项目中使用它,这可能是原因吗?它在 swift 2 throught dispatch_once 中运行良好。
我尝试在 swizzling(self) 之前放置断点,它在 UIView 上调用了一次,正如预期的那样。
【问题讨论】:
标签: ios swift uiview swift3 swizzling