的main.m
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
CoolClass.h
#import <Cocoa/Cocoa.h>
@interface CoolClass : NSObject <NSApplicationDelegate> {
}
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification;
@end
CoolClass.m
#import "CoolClass.h"
@implementation CoolClass
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification {
NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE");
}
@end
我也尝试过“applicationWillFinishLaunching”,但仍然没有运气。任何帮助都将不胜感激。感谢。
答案 0 :(得分:6)
您应该将CoolClass
定义为Interface Builder中的应用程序委托(Ctrl +从App实例拖动到CoolClass实例
答案 1 :(得分:5)
您所缺少的是采用该协议使得CoolClass类型的对象可以作为任何NSApplication对象的委托使用(前提是您完成了声明并实现了协议的所有必需方法)。当您将类的实例设置为应用程序的委托时,声明对协议的一致性也会阻止编译器警告。
但是对于特定的应用程序对象(例如,Cocoa为您创建的共享NSApplication对象)知道如何将协议中的消息发送到特定的CoolClass对象,您必须将要接收这些消息的对象设置为特定的应用程序对象的委托。
这意味着,在您希望接收的消息将被应用程序发送之前的某个时间,需要实例化CoolClass对象 - 称之为c
- 并告诉应用程序,“嘿,您的代表这里是c
,所以从现在开始将代表信息发送给小费用。“
归结为这些代码行必须在应用程序完成启动之前执行:
CoolClass *c = [[CoolClass alloc] init];
[[NSApplication sharedApplication] setDelegate:c];
实现这一目标的最简单方法是让Interface Builder为您完成工作:让MainMenu nib实例化您的CoolClass,并在加载nib时将cool类对象设置为应用程序的委托,正如其他人所建议的那样。
要执行此操作,请打开MainMenu.xib。将自定义对象拖到xib中,并在检查器中将其类更改为CoolClass。按住Ctrl键(或右键单击拖动)从xib中的应用程序对象到CoolClass对象,然后选择“委托”。保存,构建和运行。
答案 2 :(得分:1)
applicationDidFinishLaunching
是一个实例方法,而不是类方法。也就是说,您需要对类进行实例化才能接收该消息。另外,它不能只是 - 任何实例化;您的应用程序需要知道您的实例化,并知道它应该向其发送委托消息。最简单和最常见的方法是......
首先,您将实例化您的CoolClass。在Interface Builder中打开应用程序的MainMenu.nib文件。从“库”窗口中拖出“对象”(它看起来像蓝色立方体)。选择它并使用Inspector的Identity选项卡将其类从NSObject更改为CoolClass。现在,您有一个CoolClass实例。
现在,您将该实例设置为应用程序的委托。控制 - 从“应用程序”(仍在Interface Builder中)拖动到新的CoolClass实例。将弹出一个窗口(显示可以连接到您的对象的应用程序的出口)。选择“委托”。现在您的应用程序已将CoolClass的实例设置为其委托,因此,您的applicationDidFinishLaunching
将会运行。
答案 3 :(得分:0)
我感谢您可能正在尝试从头开始学习,但为什么您不只是使用其中一个XCode模板创建新项目?它为您提供了所有这一切。生活涉及足够的调试,而不必在它上面添加更多!
答案 4 :(得分:0)
从头开始:您对NSApplicationMain
的通话应包含在NSAutoreleasePool
中。如果你不这样做,你就会遇到麻烦。