例如当每个窗口/视图控制器都调用viewDidLoad
时,是否有一种通知方式?就像一个viewcontrollers跟踪器。我不想重复太多代码。谢谢
答案 0 :(得分:3)
您可以创建一个BaseViewController
并从中继承您要观察的所有其他视图控制器。
class BaseViewController:UIViewController{
func viewDidLoad(){
super.viewDidLoad()
print("inherit all viewControllers with this class")
print("perform your work you wanted to do")
}
}
class firsViewController: BaseViewController{
func viewDidLoad(){
super.viewDidLoad()
print("I will call baseViewController too")
}
}
class SecondViewController: BaseViewController{
func viewDidLoad(){
super.viewDidLoad()
print("I will call baseViewController too")
}
}
答案 1 :(得分:1)
创建一个基本视图控制器,并使用它来扩展所有控制器,而不是像class MyViewController: BaseViewController {
那样扩展UIViewController,然后您可以在基本viewDidLoad
中执行任何操作,这将为所有控制器运行而使它们全部执行{{ 1}}。
答案 2 :(得分:1)
您有几种方法可以做到这一点:
您可以为ex创建Global类:您将ViewController类包含其中的代码,然后创建该类的子类,而不是UIViewController作为另一个答案中提到的继承概念。
或者您也可以使用类方法创建扩展,协议和类,并且可以在视图控制器中的每个位置使用该类共享实例。
答案 3 :(得分:1)
还有另一种方法不需要覆盖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
}
就是这样!