2011-08-31 52 views
0

NSWindowController在windowDidLoad得到窗口都具有此代码:可可:在控制器

- (id)init { 
    [self initWithWindowNibName:@"MyWindow"];  
    [self loadWindow]; 
    return self; 
} 

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 

    NSWindow *window = [self window]; 
    NSAssert(window != nil, @"Can’t get window!"); 

    // do some stuff  
} 

NSAssert失败。

为什么?

我怎样才能看到窗户?

+0

正确连接在笔尖上? – 2011-08-31 22:11:30

+0

@WTP:这是什么意思?我该如何检查? – Albert

回答

3

这里有两个问题。首先,你的初始化器丢失分配给self

- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyWindow"]; 
    if(self) 
    { 
     [self loadWindow]; 
    } 
    return self; 
} 

其次,及可能的原因,你的断言失败,是你没有连接window出口文件所有者在你的笔尖文件到窗口对象。这意味着你的窗口控制器不知道window属性指向什么对象。

如果您不了解如何在界面生成器中设置网点,那么您有很多学习要做,因此在做其他事情之前,您应该先执行simple tutorial,因为了解网点和操作如何工作对于能否成功至关重要与可可一起编程。

+0

啊,这对我来说不是直接的。我认为如果我使用'initWithWindowNibName',即控制器加载并创建窗口,显然控制器拥有该窗口并可以为其设置自己的'window'属性。另外,我如何使用其他控制器的相同窗口NIB呢? – Albert

+1

只要在笔尖中分配给“文件所有者”的类名与您用作笔尖所有者的类相同(或者所有者是子类)。你当然可以从同一个nib实例化多个不同的窗口控制器。笔尖只是对象的归档图形,当您加载它时,这些归档对象将被实例化为新对象。如果再次使用不同的控制器加载笔尖,则不会得到重复的对象。 –

+0

但是如果我想要不同类名的不同窗口控制器使用相同的NIB呢?为什么NIB需要知道控制器的所有信息? – Albert

-2

不应该有一个

self = [super init]; 

- (id)init { 
[self initWithWindowNibName:@"MyWindow"];  
[self loadWindow]; 
return self; 

}

+0

不可以。指定的初始化程序是'initWithWindowNibName:',但是你应该在'super'上调用它。 –