在Cocoa Application中的applicationDidFinishLaunching中加载主窗口

时间:2012-01-03 05:12:40

标签: macos cocoa

在Cooca应用程序中,MainMenu.xib是在标准模板中为您设置的。此笔尖也已与应用程序委托一起设置。在info.plist中,键"主nib文件bas ename"将nib文件设置为在启动时加载。

我希望应用程序在没有nib的情况下启动,我想在applicationDidFinishLaunching中加载应用程序主代理中的MainMenu.xib。

有可能吗?

2 个答案:

答案 0 :(得分:3)

首先,在支持文件中注释掉NSApplicationMain - > main.m. NSApplicationMain()加载Info.plist中提到的主笔尖,所以跳过它。相反,设置应用程序并委派并运行应用程序:

int main(int argc, const char * argv[])
{
    //return NSApplicationMain(argc, argv);

    @autoreleasepool {
        NSApplication * application = [NSApplication sharedApplication];
        MYAppDelegate* appDelegate = [[MYAppDelegate alloc] init];

        [application setDelegate:appDelegate];
        [application run];
    }

    return EXIT_SUCCESS;
}

然后,在app delegate的applicationDidFinishLaunching:函数中,调用类似于createMainWindow的东西:

- (void)createMainWindow
{
    self.wincon = [[MYCustomWindowController alloc] initWithWindowNibName:@"MainMenu"];
    self.window = self.wincon.window; // window property in appdelegate created for single-view app
    // Also had to connect About: to application's orderFrontStandardAboutPanel
}

MainMenu.xib的File's Owner自定义类应该从应用程序切换到MYCustomWindowController。

如果MainMenu.xib有一个如本例所示的窗口,那么它的“引用插座”需要连接到File的Owner->窗口。

如果您从单个视图应用程序开始,请从MainMenu.xib中删除App Delegate对象 - 否则xib将创建应用程序委托的第二个实例。如果您引用类似MYAppDelegate.managedObjectContext的内容,这可能会很糟糕。如果需要绑定到应用程序委托,则可以使用delegate.managedObjectContext的键路径绑定到Application。

为什么我这样做?因为有时候我的应用程序会启动一个GUI,有时却没有。

答案 1 :(得分:1)

这是可能的,但很少值得IMO的麻烦。如果你已经有一个捆绑包,那么包含一个小的nib文件(仅菜单;没有窗口)的成本很低。如果要在启动后从单独的nib文件加载其余的UI,那很好。但我建议允许MainMenu.nib加载并提供主菜单。 (你不清楚你试图用你的方法解决什么问题。)

那就是说,Lap Cat写了一系列关于这个名为“没有笔尖工作”的文章值得一读。你会想要上一篇文章The Empire Strikes Back,其中包含了他的nibless项目的链接。他的技术仍然适用于10.7。