2010-03-11 22 views
5

在我的代碼中,CustomWindow是NSWindow的子類。加載後指向NSWindow Xib的指針?

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

你如何獲得一個指針來控制你的廈門國際銀行加載之後,所以你可以做的事情,如定心NSWindow(我指的是序列化的一個駐留在XIB裏面)?

我在這裏做錯了什麼?

回答

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中,設置類文件所有者的是MyWindowControllerwindow出口文件所有者的連接到您的筆尖的窗口對象。

然後,您可以這樣做顯示窗口:

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

除了「連接文件所有者的窗口」之外,我已經在做你所說的一切了。一旦我做到了這一切工作。謝謝一堆! +1和Tick。 –

+0

確保在IB中取消選中窗口的「Restorable」屬性。 –

+0

@KeithSmiley哪個編輯器是'Restorable'屬性,還是這不再適用於Xcode 5.x? –

1

你可能不想讓你的窗口成爲文件的所有者。通常你會通過self或某個控制器對象。然後,如果self或該控制器對象具有CustomWindow IBOutlet,那麼當您撥打loadNibNamed:時它會掛鉤。查看this post作爲示例代碼。

+0

CustomWindow是控制器對象。它包含IBOutlets,當我運行應用程序時,它會被連接起來。窗戶上的控件都可以工作。只是無法弄清楚如何居中。 –

0

XIB是一個對象的容器,它不等於一個窗口。你不能居中一個XIB,你只能居中一個包含在XIB中的窗口。

此外,XIB中的對象在您加載時創建。您不會傳遞一個對象作爲所有者,然後代表XIB中的某個對象,而是使用IBOutlets來獲取對加載XIB時創建的新對象的引用,然後您可以與它們交互。

文件所有者對象是XIB中的一個特殊對象,因爲它是唯一沒有創建的對象,您可以通過將它傳遞給loadNibNamed:owner:來指定。這是您在XIB創建的對象和您的應用程序之間的網關。

通常,所有者對象是某種控制器類。將Interface Builder中的文件所有者的類設置爲您的控制器類,然後在類中定義一些IBOutlet,它們將顯示在文件所有者的Interface Builder中,並且可以將XIB中的對象連接到它們。

最後,當您將控制器對象傳遞給loadNibNamed:owner:時,Cocoa會將您的IBOutlets連接到新創建的對象,並且您可以使用它們與它們交互,例如,將窗口居中在XIB中。

+0

你描述我已經設置了什麼。 IBOutlets沒有問題,我不想獲得指向XIB的指針。 XIB包含NSWindow,我想要一個指向 –

+0

的指針這就是您在IB中使用「文件所有者」的原因。它是您傳入loadNibNamed:方法的對象的代理。見另一個答案。 –

+0

是的,這是我的。原來問題是我沒有連接到XIB窗口對象的文件所有者窗口出口。 –

2

在下面我的代碼,CustomWindow是NSWindow的子類。

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

你如何獲得一個指針來控制你的廈門國際銀行加載之後,所以你可以做的事情,如定心NSWindow的XIB裏面?

「定心NSWindow的廈門國際銀行內部」是沒有意義的(你會居中屏幕上),除非你的意思是定心NSWindow對象,它是廈門國際銀行裏面,在這種情況下,爲什麼你創造另一個NSWindow(CustomWindow)對象在xib之外?

請記住,一個nib(或xib)是對象的存檔。如果您想使用筆尖中的窗口,則需要創建一個指向該窗口的出口,將文件所有者的類別設置爲您添加出口的類別,然後將出口連接到IB,並通過將該對象傳遞給owner:參數來指定該出口作爲文件所有者。這個對象,作爲所有者,然後將負責處理窗口。它可能(通常是在我的代碼中)加載筆尖的相同對象。

此外,init不適用於NSWindow;您必須使用initWithContentRect:styleMask:backing:defer:initWithContentRect:styleMask:backing:defer:screen:。使用init只有在您自己在CustomWindow中實現了init並且使用[super init…]消息的那兩個選擇器之一纔有效。