装载后指向NSWindow Xib的指针?

时间:2010-03-11 19:09:59

标签: objective-c cocoa xib

在我的下面的代码中,CustomWindow是NSWindow的子类。

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

如何在加载后获得一个控制XIB的指针,这样你可以做一些事情,例如居中的NSWindow(我的意思是位于XIB内的序列化的)?

我在这里做错了什么?

4 个答案:

答案 0 :(得分:16)

您应该使用NSWindowController子类。 NSWindowController专门用于完成您想要实现的目标,并解决了使用NSBundle方法直接加载nib时遇到的几个问题。您通常应该始终使用NSWindowController子类来管理窗口。

创建NSWindowController的子类:

@interface MyWindowController : NSWindowController {}
@end

@implementation MyWindowController
- (id)init
{
    self = [super initWithWindowNibName:@"MyWindow"];
    if(self)
    {
        //initialize stuff
    }
    return self;
}
//this is a simple override of -showWindow: to ensure the window is always centered
-(IBAction)showWindow:(id)sender
{
    [super showWindow:sender];
    [[self window] center];
}
@end

在Interface Builder中,将文件所有者的类设置为MyWindowController,并将文件所有者window出口连接到窗口对象在你的笔尖。

然后您可以通过以下方式显示窗口:

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];

答案 1 :(得分:2)

  

在我的下面的代码中,CustomWindow是NSWindow的子类。

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work
     

如何在加载XIB后获得一个控制XIB的指针,这样你可以做一些事情,例如将NSWindow集中在XIB中?

“将NSWindow置于XIB中心”没有任何意义(你可以将它放在屏幕上),除非你的意思是居中于xib内部的NSWindow对象,在这种情况下,为什么是你在xib之外创建了另一个NSWindow(CustomWindow)对象吗?

请记住,nib(或xib)是对象的归档。如果您想使用笔尖中的窗口,则需要创建一个指向该窗口的插座,将文件所有者的类设置为您添加插座的类,将插座连接到IB,并通过将对象传递给owner:参数,将该对象与出口指定为文件所有者。该对象作为所有者将负责使用该窗口。它可能(通常是在我的代码中)加载笔尖的相同对象。

此外,init对NSWindow不起作用;您必须使用initWithContentRect:styleMask:backing:defer:initWithContentRect:styleMask:backing:defer:screen:。使用init只有在自己在CustomWindow中实现init并使用其中一个选择器作为[super init…]消息时才有效。

答案 2 :(得分:1)

您可能不希望将窗口设为文件所有者。通常你会在那里传递self或一些控制器对象。然后,如果self或该控制器对象具有CustomWindow IBOutlet,则在您调用loadNibNamed:时它将被连接起来。查看this post代码示例。

答案 3 :(得分:0)

XIB是对象的容器,它不等于窗口。您不能将XIB居中,只能将XIB中包含的窗口居中。

此外,加载XIB时会创建对象。您不会将对象作为所有者传递,然后代表XIB中的一个对象,而是使用IBOutlets来获取对加载XIB时创建的新对象的引用,然后您可以与它们进行交互。

File的Owner对象是XIB中的一个特殊对象,因为它是唯一未创建的对象,您可以通过将其传递给loadNibNamed:owner:来指定。它是XIB创建的对象和应用程序之间的网关。

通常,owner对象是某种控制器类。将Interface Builder中的文件所有者类设置为控制器类,然后在类中定义一些IBOutlet,它们将显示在文件所有者的Interface Builder中,您可以将XIB中的对象连接到它们。

最后,当您将控制器对象传递给loadNibNamed:owner:时,Cocoa会将您的IBOutlet连接到新创建的对象,您可以使用它们与它们进行交互,例如:在XIB中居中一个窗口。