5

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

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

加载后如何获得控制 XIB 的指针,以便您可以执行诸如将 NSWindow 居中(我的意思是驻留在 XIB 内的序列化窗口)之类的事情?

我在这里做错了什么?

4

4 回答 4

16

您应该使用NSWindowController子类。NSWindowController专门设计用于完成您想要实现的目标,并解决了如果您直接使用NSBundle. 您通常应该始终使用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 中,将 File's Owner 的类设置为,并将File's Owner出口连接MyWindowController到您的 nib 中的窗口对象。window

然后,您可以通过执行以下操作来显示窗口:

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];
于 2010-03-12T04:06:50.147 回答
2

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

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

加载后如何获得控制 XIB 的指针,以便执行诸如将 NSWindow 居中在 XIB 内之类的操作?

“将 NSWindow 在 XIB 内居中”没有任何意义(你会将其居中在屏幕上),除非你的意思是在 xib 内的 NSWindow 对象居中,在这种情况下,你为什么要在外面创建另一个 NSWindow (CustomWindow) 对象西布?

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

此外,init不适用于 NSWindow;你必须使用initWithContentRect:styleMask:backing:defer:or initWithContentRect:styleMask:backing:defer:screen:init仅当您init在 CustomWindow 中实现了自己并为消息使用了这两个选择器之一时,使用才有效[super init…]

于 2010-03-13T08:57:18.330 回答
1

您可能不想让您的窗口成为文件的所有者。通常你会self在那里传递一些控制器对象。然后,如果self或那个控制器对象有一个 CustomWindow IBOutlet,它会在你调用loadNibNamed:. 查看这篇文章以获取示例代码。

于 2010-03-11T19:21:23.703 回答
0

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

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

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

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

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

于 2010-03-11T21:25:07.180 回答