Ios 如何获取所有UIViewControllers视图的回调将出现

Ios 如何获取所有UIViewControllers视图的回调将出现,ios,swift,Ios,Swift,当屏幕上出现每个UIViewController时,我正在使用swizzling调用一个方法 代码: 但我得到一个警告: 方法'initialize()定义了Objective-C类方法'initialize',Swift不能保证调用该方法,并且在将来的版本中将不允许使用该方法 有没有不同的方法可以得到相同的结果 谢谢你确定你真的需要swizzling吗?据我所知,实现swizzling的最佳实践是使用baseViewController继承所有ViewController,然后在ViewWil

当屏幕上出现每个
UIViewController
时,我正在使用swizzling调用一个方法

代码:

但我得到一个警告:

方法'initialize()定义了Objective-C类方法'initialize',Swift不能保证调用该方法,并且在将来的版本中将不允许使用该方法

有没有不同的方法可以得到相同的结果


谢谢

你确定你真的需要swizzling吗?据我所知,实现swizzling的最佳实践是使用baseViewController继承所有ViewController,然后在ViewWill中完成所需的全部工作。不需要调用任何方法。我的第一个选择是使用继承。但我认为这对我来说更好。我有一些服务要注册到所有VIewController生命周期中。对于全局更改,我认为swizzling是唯一可能的方法。由于objective-c将持续很长一段时间,我认为您可以在.m文件中创建这些动态内容,它肯定会工作,而不会出现任何警告。您确定您真的需要swizzling吗?根据我的说法,实现它的最佳实践是使用baseViewController继承所有ViewController,然后在baseViewController的ViewWill中完成所需的全部工作。不需要调用任何方法。我的第一个选择是使用继承。但我认为这对我来说更好。我有一些服务要注册到所有VIewController生命周期中。对于全局更改,我认为swizzling是唯一可能的方法。由于objective-c将持续很长一段时间,我认为您可以在.m文件中创建这些动态内容,它肯定会工作,而不会发出任何警告。
extension UIViewController {

    open override class func initialize() {

        guard self === UIViewController.self else { return }

        let originalSelector = #selector(self.viewWillAppear(_:))
        let swizzledSelector = #selector(self.proj_viewWillAppear(animated:))
        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }

    func proj_viewWillAppear(animated: Bool) {
        self.proj_viewWillAppear(animated: animated)
        let viewControllerName = NSStringFromClass(type(of: self))
        print("viewWillAppear: \(viewControllerName)")
    }
}