当我们必须使用这些方法时,你能解释一下吗?以及在什么样的情况下我们应该使用哪种方法?现在我测试哪个有效并使用它(是的,我是初学者).. 谢谢。我正在为 MAC 开发。
2 回答
首先,你永远不应该自己调用 awakeFromNib 和 windowDidLoad。你可以在你的自定义类中实现它们,然后 Cocoa 会在适当的时候调用它们。
awakeFromNib 适用于从 nib 存档加载的所有对象,而不仅仅是窗口和窗口控制器。这是一个进行设置的好地方——它是安全的(您可以保证对象已完全加载,已从其 init 调用返回,并且已设置所有出口),但还很早。
windowDidLoad(和 windowWillLoad)适用于所有窗口,无论是从 nib 存档加载还是动态创建。但它不是在窗口上调用的,而是在窗口的控制器上调用的。(通常你不是在创建你自己的 NSWindow 子类,而是你在创建你自己的 NSWindowController 子类。)如果你有依赖于正在加载的窗口的设置代码,你应该把它放在这里(但实际上在简单的情况下,因为一旦您尝试访问 window 属性,它就会被创建)。
initWithWindow: 是你自己称呼的东西,但刚入门的 Cocoa 程序员可能永远不想这样做。
您可能应该阅读 Xcode 附带的一些指南。如果您想要基于文档的应用程序,请从“Mac 的基于文档的应用程序编程指南”开始。如果你想要一个单窗口实用应用程序,你仍然需要了解 MVC 等,所以你实际上可能想先构建一个基于文档的应用程序来学习你的方法。
此外,如果您想了解事件的顺序,请尽可能覆盖每条消息,并添加类似 NSLog(@"%s", __FUNCTION__); 的内容。你的系统日志将揭示一切。
initWithWindow
在您的窗口从 NIB 取消归档后,NIB 取消归档会被调用。这是初始化窗口控制器的地方。一旦整个取消归档过程完成 - 意味着您的窗口控制器和 UIView 元素已准备好 -awakeFromNib
被调用。在此之前,要么您没有 windowController,要么整个归档过程未完成。
当你[label setStingValue]
在awakeFromNib
你的窗口控制器中做准备时,你的视图对象和相关的上下文也准备好了。