有没有办法在例如每个窗口/ 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/