fri*_*cat 2 delegates objective-c ios swift
我想listener每当推送一个新的UIViewController时都报告一种。我可以通过从单个类中进行子类化,然后在super viewDidLoad/ viewDidAppear调用中进行侦听来实现此目的。但是我仍然必须将子类名称传递给super。
是否有其他方法可以自动检测到何时出现新视图?
上下文是我正在一个logging报告屏幕加载时间等的库中工作。我也想听应用程序中任何一次单击的按钮。
出于日志记录的目的,您无需为每个UIViewController实例继承类或繁琐地添加代码。而是使用您自己的UIViewController的viewDidAppear方法。
private let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in
let originalMethod = class_getInstanceMethod(forClass, originalSelector)
let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
method_exchangeImplementations(originalMethod!, swizzledMethod!)
}
extension UIViewController {
static let classInit: Void = {
let originalSelector = #selector(viewDidAppear(_:))
let swizzledSelector = #selector(swizzledViewDidAppear(_:))
swizzling(UIViewController.self, originalSelector, swizzledSelector)
}()
@objc func swizzledViewDidAppear(_ animated: Bool) {
print("Add your logging logic here")
// Call the original viewDidAppear - using the swizzledViewDidAppear signature
swizzledViewDidAppear(animated)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须通过覆盖Swift 4的AppDelegate的init来启动麻烦。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
override init() {
super.init()
UIViewController.classInit
}
Run Code Online (Sandbox Code Playgroud)
@efremidze和@TikhonovAlexander的原始积分
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |