何时使用awakeFromNib,initWithWindow,windowDidLoad方法?

时间:2012-06-04 19:13:50

标签: xcode macos cocoa

当我们必须使用这些方法时,你能解释一下吗?而且在什么样的情况下我们应该使用哪种方法?现在我测试哪些工作并使用它(是的,我是初学者).. 谢谢。我正在为MAC开发。

2 个答案:

答案 0 :(得分:8)

首先,你不应该自己调用awakeFromNib和windowDidLoad。您可以在自定义类中实现它们,然后Cocoa将在适当的时候调用它们。

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

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

initWithWindow:这是你自己称之为的东西,但是Cocoa程序员可能不会想要这么做。

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

此外,如果您想了解事件的顺序,请覆盖您可以的每条消息,并添加类似NSLog(@“%s”,__ FUNCTION__)的内容;而你的系统日志将揭示一切。

答案 1 :(得分:1)

在NIB解除归档期间initWithWindow在您的窗口从NIB取消归档后立即被调用。这是Window Controller初始化的地方。整个解压缩过程完成后 - 意味着您的窗口控制器和UIView元素已准备好 - 调用awakeFromNib。在此之前,您没有windowController或整个归档过程未完成。

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