2012-09-19 29 views
5

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

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

我追加然后初始化函数如下图所示:

- (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

+0

您是否启用了ARC?我发现使用ARC时,窗口控制器会被取消分配,除非我将其设置为应用程序委托的属性(我确信有其他方法可以执行此操作)。 – sosborn

+0

我正在使用ARC。我将windowController作为AppDelegate类的静态字段。我认为它不会被解除分配,直到应用程序终止。 – morphinewan

回答

2

在你的init方法,我觉得你有你回到自己之前设置自我到超INIT第一。

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

编辑

尝试用[windowController showWindow:self]

更换makeKeyAndOrderFront:这时如果仍然无法正常工作,检查你的窗口控制器厦门国际银行,确保文件所有者设置为WYSunFlowerWindowController和IBOutlet窗口(在NSWindowController中声明)连接到窗口。

编辑2:

注释掉你@property,并在控制器@synthesize窗户的伎俩。不要重新声明已经在超类中预定义的get和setter。

+0

感谢您的帮助。我遵循你的指示,没有任何改变。仍然没有工作。 – morphinewan

+0

我已经完成了你提到的所有事情。不行。我不介意你可以下载我的项目源文件来看看吗? https://dl.dropbox.com/u/3193707/SunFlower.zip – morphinewan

+0

哦,我的天,它的工作!非常感谢。但我很困惑,为什么在子类中定义的window outlet属性会导致这个问题?他们不能重写类的父项的相同属性吗? – morphinewan

相关问题