首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIView方法快速3

UIView方法快速3
EN

Stack Overflow用户
提问于 2017-02-19 08:21:03
回答 1查看 1.3K关注 0票数 3

我正在尝试实现基于应答How to implement method swizzling swift 3.0?的swift 3中的方法

这是我的密码:

代码语言:javascript
复制
// 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项目中使用这个,这是原因吗?它在斯威夫特2通过dispatch_once很好地工作。

我在swizzling(self),之前尝试了place断点,它在UIView上调用了一次,就像预期的那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-19 09:33:15

问题是awakeFromNibNSObject的一种方法,而不是UIView的方法。您的代码使用一个UIView方法对UIView方法进行处理,当UINavigationController (或者不是UIView子类的NSObject的任何其他子类)上调用swizzled方法时,调用原始方法就会崩溃。

解决方案是尝试添加带有原始名称的swizzled方法(如http://nshipster.com/method-swizzling/中所述):

代码语言:javascript
复制
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)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42325078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档