Xcode 何时使用awakeFromNib、initWithWindow、windowDidLoad方法?

Xcode 何时使用awakeFromNib、initWithWindow、windowDidLoad方法?,xcode,macos,cocoa,Xcode,Macos,Cocoa,你能解释一下我们什么时候需要使用这些方法吗?在什么情况下我们应该使用哪种方法?现在我测试哪一个有效并使用它(是的,我是一个初学者)。。 谢谢我是为MAC开发的。首先,你不应该从NIB调用awake,然后自己加载Window。您可以在自定义类中实现它们,然后Cocoa将在适当的时候调用它们 awakeFromNib适用于从nib存档加载的所有对象,而不仅仅是窗口和窗口控制器。这是一个很好的一般安装位置,它是安全的(您可以保证对象已完全加载,已从其init调用返回,并已设置了其所有出口),但仍然很早

你能解释一下我们什么时候需要使用这些方法吗?在什么情况下我们应该使用哪种方法?现在我测试哪一个有效并使用它(是的,我是一个初学者)。。
谢谢我是为MAC开发的。

首先,你不应该从NIB调用awake,然后自己加载Window。您可以在自定义类中实现它们,然后Cocoa将在适当的时候调用它们

awakeFromNib适用于从nib存档加载的所有对象,而不仅仅是窗口和窗口控制器。这是一个很好的一般安装位置,它是安全的(您可以保证对象已完全加载,已从其init调用返回,并已设置了其所有出口),但仍然很早

windowDidLoad(和windowWillLoad)适用于所有窗口,无论是从nib存档加载还是动态创建。但它不是在窗口上调用的,而是在窗口的控制器上调用的。(通常您不是在创建自己的NSWindow子类,而是在创建自己的NSWindowController子类。)如果您有依赖于正在加载的窗口的设置代码,您应该将其放在这里(但在简单的情况下,它实际上并不是那么重要,因为只要您尝试访问window属性,就会创建它)

initWithWindow:是一种你称之为你自己的东西,但是一个刚开始的Cocoa程序员可能永远都不想这么做

您可能应该阅读Xcode附带的一些指南。如果您想要基于文档的应用程序,请从“Mac基于文档的应用程序编程指南”开始。如果你想要一个单一的窗口实用程序应用程序,你仍然需要学习MVC等等,所以你可能真的想首先构建一个基于文档的应用程序来学习你的方法


此外,如果您想了解事件的顺序,请覆盖所有可以覆盖的消息,并添加类似NSLog(@“%s”,函数)的内容;您的系统日志将显示所有内容。

在NIB取消归档期间
initWithWindow
在您的窗口从NIB取消归档后被调用。这是初始化窗口控制器的地方。一旦整个非归档过程完成-意味着您的窗口控制器和UIView元素准备就绪-
awakeFromNib
被调用。在此之前,要么您没有windowController,要么整个归档过程没有完成


当您在
awakeFromNib
中执行
[label SettingValue]
时,您的窗口控制器已准备就绪,而且您的视图对象和关联上下文已准备就绪。

我的工具栏中有一个标签项,我希望在基于上一个窗口打开窗口后设置该值(从服务器获取一些关于用户状态的值)。我首先将[label SettingValue]-方法放入initWithWindow,然后放入windowDidLoad(该类是NSWindowController的子类)-它不起作用,然后最后我把它放在awakeFromNib中,然后它起作用了-你能解释一下为什么会发生这种情况吗?正如我所说的,如果你想了解发生了什么,请覆盖你能想到的每一条消息(最好是在你的应用程序代理、窗口、视图等中,而不仅仅是在你的窗口控制器中)并在每个日志中添加一条NSLog消息,然后您将看到事件的顺序,然后它将对您更有意义。