为什么我的NSApplicationDelegate类中的applicationWillFinishLaunching从未被调用?

dem*_*319 2 xcode cocoa delegates objective-c

的main.m

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    return NSApplicationMain(argc,  (const char **) argv);
}
Run Code Online (Sandbox Code Playgroud)

CoolClass.h

#import <Cocoa/Cocoa.h>

@interface CoolClass : NSObject <NSApplicationDelegate> {

}
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification;
@end
Run Code Online (Sandbox Code Playgroud)

CoolClass.m

#import "CoolClass.h"

@implementation CoolClass
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification {
    NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE");
}

@end
Run Code Online (Sandbox Code Playgroud)

我也试过"applicationWillFinishLaunching",但仍然没有运气.任何帮助都将不胜感激.谢谢.

Eim*_*tas 6

您应该CoolClass在Interface Builder中定义您的应用程序委托(Ctrl +从App实例拖动到您的CoolClass实例

  • 或者,如果你想以编程方式执行,可以在`CoolClass`的`-init`方法中调用`[NSApp setDelegate:self]`. (3认同)

Jer*_*man 6

您所缺少的是采用该协议使得CoolClass类型的对象可以作为任何NSApplication对象的委托使用(前提是您遵循声明并实现协议的所有必需方法).当您将类的实例设置为应用程序的委托时,声明对协议的一致性还会阻止编译器警告.

但是对于特定的应用程序对象(比如,Cocoa为您创建的共享NSApplication对象)知道将消息从协议发送到特定的CoolClass对象,您必须将要接收这些消息的对象设置为特定的应用程序对象的委托.

这意味着,在您希望接收的消息将被应用程序发送之前的某个时间,某些东西需要实例化CoolClass对象 - 调用它c- 并告诉应用程序,"嘿,您的委托已经c在这里,所以发送委托消息从现在开始对小费者来说."

归结为这些代码行必须在应用程序完成启动之前执行:

CoolClass *c = [[CoolClass alloc] init];
[[NSApplication sharedApplication] setDelegate:c];
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最简单方法是让Interface Builder为您完成工作:让MainMenu nib实例化您的CoolClass,并在加载nib时将cool类对象设置为应用程序的委托,正如其他人所建议的那样.

为此,请打开MainMenu.xib.将自定义对象拖到xib中,并在检查器中将其类更改为CoolClass.按住Ctrl键(或右键单击拖动)从xib中的应用程序对象到CoolClass对象,然后选择"委托".保存,构建和运行.