我试图实现对答案How to implement method swizzling swift 3.0?UIView的方法混写SWIFT 3
在这里,在迅速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到dispatch_once中工作正常。
我试着在swizzling(self)之前尝试过放置断点,并且它按照预期在UIView上调用一次。
是的,已经得到它。找到你的答案后张贴我自己的:) –