ios - 如何在 UIViewController 出现时得到通知?

标签 ios swift

有没有办法在例如每个窗口/ View Controller 调用 viewDidLoad 时收到通知?就像一个 View Controller 跟踪器。我不想重复太多代码。谢谢

最佳答案

还有另一种方法不需要覆盖项目中的所有类即可从 BaseViewController 继承。这就是方法调配。 方法调配是在运行时更改现有选择器的实现的过程。基本上,它只是在运行时更改方法的功能。

因此,您可以执行以下操作:

extension UIViewController {
    static let classInit: Void = {
        let originalSelector = #selector(viewDidLoad)
        let swizzledSelector = #selector(proj_viewDidLoad)
        swizzling(UIViewController.self, originalSelector, swizzledSelector)
    }()

    // MARK: - Method Swizzling

    @objc func proj_viewDidLoad() {
        self.proj_viewDidLoad()

        let viewControllerName = NSStringFromClass(type(of: self))
        /// Whatever you want in here
        print("viewDidLoad: \(viewControllerName)")
    }
 }

private let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in
    guard
        let originalMethod = class_getInstanceMethod(forClass, originalSelector),
        let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
    else { return }
    method_exchangeImplementations(originalMethod, swizzledMethod)
}

之后,您需要在 AppDelegate 中激活它,方法如下:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {   
    override init() {
        super.init()
        UIViewController.classInit
    }
    /// ... the rest
}

就是这样!

关于ios - 如何在 UIViewController 出现时得到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501088/

相关文章:

ios - 在 iPAD 键盘中制作下一个按钮

ios - 在 iAd 的前滚动视频广告中收到错误,但广告播放

ios - 将 xctest 框架添加到旧项目

ios - 核心数据关系、多个托管对象上下文和线程

swift - 如何检查当前用户是否是 Realm SyncUser 的管理员?

swift - 快速将文本字段数据存储到字典中

swift - 扩展 对于除一种类型之外的所有类型都是可选的

ios - 如何制作带按钮的右滚动菜单?

iphone - 如何创建多个 UIImageView 动画,使用 CFAffineTransform 在前一个动画结束后开始一个动画

ios - 从另一个类获取值后 NSInteger 保持为 null