如何使用NSWindowController在标准应用程序中显示一个窗口?

时间:2012-09-19 07:14:17

标签: objective-c xcode cocoa nib nswindowcontroller

我使用Xcode模板创建了一个新的空白标准应用程序。删除了MainMenu.xib中的窗口,我用xib创建了一个新的自定义NSWindowController子类。

他们被命名为“WYSunFlowerWindowController.h”和“WYSunFlowerWindowController.m”。

然后我添加如下的init函数:

- (id)init
{
    NSLog(@"init()");

    return [super initWithWindowNibName:@"WYSunFlowerWindowController" owner:self];
}

我的WYAppDelegate.m文件如下所示:

static WYSunFlowerMainWindowController* windowController = nil;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    if (windowController == nil) {
        windowController = [[WYSunFlowerMainWindowController alloc] init];
    }
    [[windowController window] makeKeyAndOrderFront:windowController];
}

我有问题,在启动应用程序后,窗口无法自动显示。谁能告诉我为什么?我的代码有什么问题吗?

我是Objective-C和可可的新手。所以我想我可能犯了一个愚蠢的错误,我自己无法弄明白。

更新:

这是我的项目来源。请看看,帮我弄清楚我的错误。

https://dl.dropbox.com/u/3193707/SunFlower.zip

1 个答案:

答案 0 :(得分:2)

在你的init方法中,我认为你必须在返回self之前先将self设置为super init。

-(id)init
{
    NSLog (@"init()");
    self = [super initWithWindowNibName:@"WYSunFlowerWindowController" owners:self];
    return self;
}

修改

尝试使用makeKeyAndOrderFront:

替换[windowController showWindow:self]

然后,如果仍然无效,请检查您的窗口控制器xib,确保文件所有者设置为WYSunFlowerWindowController,并且IBOutlet窗口(在NSWindowController中声明)已连接到窗口。

编辑2:

在控制器中注释掉你的@property和@synthesize窗口是个窍门。不要重新声明已经在超类中预定义的get和setter。