为什么在AppKit中主视图的draw方法之后调用applicationDidFinishLaunching

时间:2017-04-16 02:55:46

标签: xcode macos appkit

我习惯在iOS中的applicationDidFinishLaunching中执行应用初始化,但在appKit中,在主视图的draw方法之后它被称为!由于应用程序尚未初始化,因此绘制任何内容为时尚早。这是订单:

  1. viewDidLoad(主视图控制器)
  2. draw(_ dirtyRect:)(主控制器视图)
  3. applicationDidFinishLaunching(太迟了!)
  4. 关于applicationDidFinishLaunching

    API reference says以下内容
      

    在应用程序的主运行循环之后调用此方法   开始但在处理任何事件之前。

    因此,应在 applicationDidFinishLaunching之后张贴抽奖活动。 我不习惯这种行为 - 发生了什么?

1 个答案:

答案 0 :(得分:4)

你只是做出错误的假设。在调用viewDidLoad之前,初始视图控制器的applicationDidFinishLaunching 会触发。那是因为运行时加载了故事板的初始窗口控制器,并在调用app委托上的applicationDidFinishLaunching之前导致其视图被加载。

如果您需要在主视图draw之前举办活动,请实施applicationWillFinishLaunching。但是,由于您现在知道事件的实际顺序,在主视图控制器的viewDidLoad中进行应用程序初始化会更好,因为它甚至更早。毕竟,如果您最初绘制的内容取决于您之前执行的初始化,viewDidLoad似乎完全适合。

您可以在传统的基于故事板的传统启动中获得的最早的事件是应用代表的awakeFromNib。但要小心,因为在macOS中,它可以比你预期的更频繁地调用。 (实际上,类方法initialize甚至更早,但要警告你不能在Swift中实现它。)