出现UIViewController时如何获得通知?

时间:2019-12-27 12:52:23

标签: ios swift

例如当每个窗口/视图控制器都调用viewDidLoad时,是否有一种通知方式?就像一个viewcontrollers跟踪器。我不想重复太多代码。谢谢

4 个答案:

答案 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
}

就是这样!