2017-02-19 33 views
2

我试图实现对答案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上调用一次。

回答

1

问题是awakeFromNibNSObject和 而不是UIView的方法。代码碎冰鸡尾酒的方法NSObjectUIView一个 方法,并调用原方法崩溃 当绞合的方法被称为上UINavigationController (或NSObject任何其他子类,可以不是UIView的子类)。

的解决方法是尝试与 原来的名字第一次添加绞合方法(如http://nshipster.com/method-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) 

    let didAddMethod = class_addMethod(view, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 
    if didAddMethod { 
     class_replaceMethod(view, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) 
    } else { 
     method_exchangeImplementations(originalMethod, swizzledMethod) 
    } 
} 
+0

是的,已经得到它。找到你的答案后张贴我自己的:) –