为什么applicationDidFinishLaunching在AppKit中主视图的draw方法之后被调用
Why is applicationDidFinishLaunching called after main view's draw method in AppKit
我习惯于在 iOS 中的 applicationDidFinishLaunching
中执行应用程序初始化,但在 appKit 中它被调用 在 主视图的 draw
方法!由于应用程序尚未初始化,现在绘制任何内容还为时过早。这是顺序:
viewDidLoad
(主视图控制器)
draw(_ dirtyRect:)
(主控制器视图)
applicationDidFinishLaunching
(来不及了!)
API reference says以下约applicationDidFinishLaunching
This method is called after the application’s main run loop has been
started but before it has processed any events.
因此应在 applicationDidFinishLaunching
之后发布抽奖活动。
我不习惯这种行为 -- 这是怎么回事?
你只是在做一个错误的假设。在调用 applicationDidFinishLaunching
之前,初始视图控制器的 viewDidLoad
确实 触发。那是因为运行时加载故事板的初始 window 控制器,并导致加载其视图,然后在应用程序委托上调用 applicationDidFinishLaunching
。
如果您需要在主视图 draw
之前发生事件,请实施 applicationWillFinishLaunching
。但它会更好,因为您现在知道事件的实际顺序,在主视图控制器的 viewDidLoad
中进行应用程序初始化,因为它甚至更早。毕竟,如果您最初绘制的内容取决于您之前执行的初始化,那么 viewDidLoad
似乎非常适合。
您可以在基于现代故事板的传统现代启动中获得的最早 事件是应用程序委托的 awakeFromNib
。但要小心,因为在 macOS 中它的调用频率可能比你预期的要高。 (实际上,class 方法 initialize
甚至更早,但请注意,您不能在 Swift 中实现它。)
我习惯于在 iOS 中的 applicationDidFinishLaunching
中执行应用程序初始化,但在 appKit 中它被调用 在 主视图的 draw
方法!由于应用程序尚未初始化,现在绘制任何内容还为时过早。这是顺序:
viewDidLoad
(主视图控制器)draw(_ dirtyRect:)
(主控制器视图)applicationDidFinishLaunching
(来不及了!)
API reference says以下约applicationDidFinishLaunching
This method is called after the application’s main run loop has been started but before it has processed any events.
因此应在 applicationDidFinishLaunching
之后发布抽奖活动。
我不习惯这种行为 -- 这是怎么回事?
你只是在做一个错误的假设。在调用 applicationDidFinishLaunching
之前,初始视图控制器的 viewDidLoad
确实 触发。那是因为运行时加载故事板的初始 window 控制器,并导致加载其视图,然后在应用程序委托上调用 applicationDidFinishLaunching
。
如果您需要在主视图 draw
之前发生事件,请实施 applicationWillFinishLaunching
。但它会更好,因为您现在知道事件的实际顺序,在主视图控制器的 viewDidLoad
中进行应用程序初始化,因为它甚至更早。毕竟,如果您最初绘制的内容取决于您之前执行的初始化,那么 viewDidLoad
似乎非常适合。
您可以在基于现代故事板的传统现代启动中获得的最早 事件是应用程序委托的 awakeFromNib
。但要小心,因为在 macOS 中它的调用频率可能比你预期的要高。 (实际上,class 方法 initialize
甚至更早,但请注意,您不能在 Swift 中实现它。)