首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 4+ swizzle viewWillAppear()

Swift 4+ swizzle viewWillAppear()
EN

Stack Overflow用户
提问于 2017-11-29 02:08:48
回答 0查看 1.8K关注 0票数 0

我的问题不是如何swizzle,而是在这个特定的代码片段中发生了什么:

代码语言:javascript
复制
private let swizzling: (UIViewController.Type) -> () = { viewController in

    let originalSelector = #selector(viewController.viewWillAppear(_:))
    let swizzledSelector = #selector(viewController.proj_viewWillAppear(animated:))

    let originalMethod = class_getInstanceMethod(viewController, originalSelector)
    let swizzledMethod = class_getInstanceMethod(viewController, swizzledSelector)

    method_exchangeImplementations(originalMethod, swizzledMethod) }

extension UIViewController {

    open override class func initialize() {
        // make sure this isn't a subclass
        guard self === UIViewController.self else { return }
        swizzling(self)
    }

    // MARK: - Method Swizzling

    func proj_viewWillAppear(animated: Bool) {
        self.proj_viewWillAppear(animated: animated)

        let viewControllerName = NSStringFromClass(type(of: self))
        print("viewWillAppear: \(viewControllerName)")
    } 
 }

代码狙击手来自这里:Swizzling CocoaTouch class

我的问题是关于下面这行代码:

代码语言:javascript
复制
// make sure this isn't a subclass
guard self === UIViewController.self else { return }

为什么我们需要检查它是否不是UIViewController的子类?我的场景是,我想要将带有视图名称的分析数据发送到on(在ever viewWillAppear上)。如果我执行检查,swizzling永远不会起作用,但是当我注释掉这一行时,我会得到我想要的结果,并且每个视图控制器都会发送数据。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47538224

复制
相关文章

相似问题

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