2010-02-11 111 views
1

的main.m为什么applicationWillFinishLaunching在我的NSApplicationDelegate类中永远不会被调用?

#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” 为好,但仍然没有运气。任何帮助都将不胜感激。谢谢。

回答

4

你错过了什么是采用协议使得那种CoolClass的对象准备用作任何的NSApplication对象的代表(前提是你在声明贯彻和落实所需的所有协议的方法)。声明与协议的一致性还可以防止在将类的实例设置为应用程序的委托时出现编译器警告。

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

这意思是,你要接收将被应用程序发送的消息前一段时间,有什么需要实例化一个CoolClass对象 - 称之为c - 并告诉该应用程序,“嘿,你的委托是c过在这里,从现在开始,把委托消息发送给小贩。“

那是什么归结为是该应用程序完成启动前的几行代码必须执行:

CoolClass *c = [[CoolClass alloc] init]; 
[[NSApplication sharedApplication] setDelegate:c]; 

最简单的方法有这种事情发生,就是让界面生成器做的工作适合你:让正如其他人所建议的,MainMenu nib实例化CoolClass,并在加载nib时将酷类对象设置为应用程序的委托。

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

6

你应该定义在Interface Builder(从App实例按Ctrl +拖动到CoolClass实例

+3

或者,您可以在'CoolClass'的'-init'方法中调用'[NSApp setDelegate:self]',如果您想以编程方式执行。 – 2010-02-11 09:36:21

+0

啊,刚刚看到上面的评论。我会尝试。 – demonslayer319 2010-02-11 09:36:51

+0

我现在有: CoolClass.m #进口 “CoolClass.h” @implementation CoolClass - (无效)INIT { [NSApp表示setDelegate:自]; NSLog(@“这应该打印到调试控制台”); } @end 但它仍然不会运行。我也修改了CoolClass.h来反映这一点。 我对上述答案感到困惑。我该拖什么,在哪里? – demonslayer319 2010-02-11 09:41:28

1

applicationDidFinishLaunchingCoolClass作为应用程序委托是一个实例方法,而不是一个类方法。也就是说,你需要一个实例你的应用程序需要知道你的实例,并知道它应该向它发送委托消息。最简单也是最常用的方法来实现这一点是...

首先,您将实例化您的CoolClass。在Interface Builder中打开您的应用程序的MainMenu.nib文件。拖动一个“Object “(它看起来像一个蓝色的立方体)出库窗口。选择它并使用检查器的标识选项卡将其类从NSObject更改为CoolClass。现在,你有一个CoolClass的实例。

现在,您将该实例设置为应用程序的委托。从“应用程序”(仍在界面生成器中)控制拖动到CoolClass的新实例。将弹出一个窗口(显示可连接到您的对象的应用程序的出口)。选择“委托”。现在,您的应用程序将CoolClass集的一个实例设置为其代理,因此,您的applicationDidFinishLaunching将运行。

+0

如果您采用并且未实现'-applicationDidFinishLaunching'(带有选择器@selector(applicationDidFinishLaunching)的实例方法),但是如果您实现了'+ applicationDidFinishLaunching'(带有选择器@选择器(applicationDidFinishLaunching))并将类本身设置为应用程序的委托('[[NSApplication sharedApplication] setDelegate:[CoolClass class]]'),应用程序对象将把消息发送给CoolClass本身。 – 2010-02-13 01:36:32

0

我很欣赏你可能试图从头学习,但你为什么不使用XCode模板创建一个新项目?它为你设置所有这一切。生活涉及足够的调试,而无需添加更多顶层!

0

要从开始处开始:您拨打NSApplicationMain应拨打NSAutoreleasePool。如果你不这样做,你会遇到麻烦。

相关问题