应用程序代理 - Cocoa

5

我想将applicationDidFinishLaunching:方法加入到我的Cocoa代理中,应该怎么做?在iPhone SDK中,applicationDidFinishLaunching已经存在于应用程序代理中,但是我制作Mac应用程序时发现没有这个方法。

最好的问候,

Kevin

3个回答

20

从Xcode 3.2开始,Mac应用程序模板也带有一个应用程序委托,已经连接好了一个具有此方法的实例。

如果是在Xcode 3.2之前创建的项目中设置,请为您要实现的委托创建一个新类。我通常称其为“AppDelegate”。您可以右键单击Classes文件夹并选择“添加文件”,然后选择Cocoa NSObject Subclass文件模板来实现它。

打开您刚创建的头文件(AppDelegate.h)。添加任何您想要的实例变量,然后点击转到副本。这将带您进入实现文件(AppDelegate.m)。在这里添加您的applicationDidFinishLaunching:实例方法。不像iPhone上那样是一个通知处理方法,因此需要传入NSNotification实例而不是NSApplication实例。

现在连接它。在资源组中,打开MainMenu.nib。从库窗口中将对象拖动到顶级nib窗口中(即带有图标的窗口,例如File's Owner和First Responder)。选择您刚创建的对象并打开Identity inspector。将对象的类设置为AppDelegate,与您在Xcode中使用的名称匹配。右键单击File's Owner并从其代理输出中将其拖到您的新对象中。

在Xcode中,将日志语句添加到您的applicationDidFinishLaunching:方法中。保存全部,然后构建并运行。切换回Xcode并打开调试器控制台。如果您没有漏掉任何步骤,您应该在那里看到日志消息。


Mac应用程序模板还附带了一个应用程序委托,已经连接好了,其中包含这样的方法。不适用于基于文档的应用程序... - zakdances
@yourfriendzak:说得好。如果你想在基于文档的应用程序中添加应用程序委托(出于某种原因),你需要遵循其余的说明。 - Peter Hosey

6
- (id)init
{
    if (self = super init]) {
        [NSApp setDelegate:self];
    }
    return self;
}

你还可以在Interface Builder中完成这个操作;从MainMenu.xib中的"File's Owner",将"delegate"插座拖动到你的对象上。不过,你可能应该考虑改用-awakeFromNib

2
你漏掉了 super init 周围的一个尖括号,并且你没有提到方法 applicationDidFinishLaunching: 必须由同一类实现才能使其正常工作。 - MKroehnert

0

你是否完全缺少应用程序委托文件?似乎 Xcode 安装脚本中存在一个错误(至少在 Snow Leopard 上的 3.2.1 版本),会将最新的项目模板安装到错误的文件夹中。旧的“Cocoa 应用程序”项目模板不包含委托文件。

我已经在博客文章修复 Xcode 项目模板中解释了我发现的问题以及如何“修复”它。

祝好, Graham


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接