在我的下面的代码中,CustomWindow是NSWindow的子类。
CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work
如何在加载后获得一个控制XIB的指针,这样你可以做一些事情,例如居中的NSWindow(我的意思是位于XIB内的序列化的)?
我在这里做错了什么?
答案 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中居中一个窗口。