2012-02-04 74 views
0

我正在用xib建立一個帶有一個主窗口控制器的可可應用程序。該xib包含許多自定義視圖類。我想添加一個NSViewController到xib,但是我遇到了一些麻煩。NSViewController未被創建

在界面生成器我可以拖動NSViewController到XIB,分配給它的定製控制器的類,並分配其以便在XIB相應的視圖。問題在於:initWithNibName:Bundle:loadView都不會被調用。

我錯過了什麼?

編輯: 人似乎都在誤解的問題,所以我會澄清。

窗口已經有一個視圖控制器。我正在尋找的是將幾個獨立的視圖控制器分配給幾個子視圖。我需要知道如何將NSViewController子類與適當的NSView子類(它是主窗口的子類)相關聯。或者換句話說,我試圖使用多個NSViewController子類來控制單個.xib文件中的許多不同的自定義視圖(每個視圖各一個)。這些控制器和子視圖都有自己的.xibs,最終應該在同一個窗口中顯示。

+0

從什麼引用'NSViewController'? – 2012-02-04 22:18:55

+0

我將它添加到xib文件(拖放),然後將其類分配給我使用IB創建的類。右側有一個選項卡,可讓您設置其「文件所有者」。 – mtmurdock 2012-02-04 22:21:55

+0

沒錯,但是如果你只是在'xib'中的任何地方放置一個對象,它不一定會渲染,特別是像'NSViewController'這樣的非View對象。你必須從代碼實例化NSViewController(在這種情況下,你的'xib'將把它作爲'File's Owner'來引用它),或者把它設置成你的ApplicationDelegate的'window'的'rootViewController' 。 – 2012-02-04 22:27:30

回答

1

我使用NSViewController該圖案是具有每視圖控制器XIB。然後,當你需要這個視圖控制器時,你可以使用alloc它並使用initWithNibName:Bundle:方法。只要你使用它的視圖,loadView將被調用。

例子:

self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease]; 
[self.window setContentView: editViewController.view]; 
+0

這不是我的問題,我試圖爲子視圖創建視圖控制器。 – mtmurdock 2012-02-06 21:57:26

+0

@mtmurdock您是否檢查過您拖入xib的控制器組件實際上是否包含您的控制器實例? – Roger 2012-02-06 22:05:46

0

我用堅持與如拿,放棄了那個東西 - 藍色圓圈在它從IB調色板白色邊框的視圖。我現在從代碼創建我的控制器,並且只通過文件所有者在IB中設置一個引用到擁有的控制器類:右鍵單擊文件所有者,在「身份」檢查器中輸入類名稱,然後從文件的所有者視圖連接到視圖。

在你的代碼,那麼你在適當的初始化點事:

[self setMyViewController = [[MyViewController alloc] initWithNibName: @"MyView" bundle: [NSBundle mainBundle]] 

針對您的特殊情況下,當從它的筆尖加載你的窗口和做好工作的準備,這可能是在windowDidLoad方法。然後,您可以將視圖添加到您的Windows內容視圖。你也可以考慮在視圖和視圖控制器之間有1:1的關係。它在維護方面讓生活變得更加輕鬆。

編輯:像@pcperini表明在他的評論,你可以使用調色板成分,但你仍然需要在你的代碼來實例化控制器。如果你想使用的調色板組件,在主控制器或AppDelegate中創建一個屬性:

@property (...) MyViewController *myViewController; 

添加的代碼實際上是創建控制器(見上文)行。然後,使用綁定檢查器將選項板組件綁定到myViewController屬性。

所以,你缺少的是你實際上沒有實例化控制器對象。編輯2:這裏是代碼(awakeFromNib是頂部控制器的方法)。它創建兩個子控制器,每個處理不同的子視圖:

- (void) awakeFromNib { 

    [[self startEndTopicHeader] setHeader: @"Event timeline boundary"]; 
    [[self startDateHeaderView] setHeader: @"Event (start) date"]; 
    [[self endDateHeaderView] setHeader: @"Event end date"]; 

    [self setStartDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]]; 
    [[[self startDateViewController] view] setFrame: [[self dummyStartView] bounds]]; 
    [[self dummyStartView] addSubview: [[self startDateViewController] view]]; 
    [[self startDateViewController] setParentController: self]; 

    [self setEndDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]]; 
    [[[self endDateViewController] view] setFrame: [[self dummyEndView] bounds]]; 
    [[self dummyEndView] addSubview: [[self endDateViewController] view]]; 
    [[self endDateViewController] setParentController: self]; 

}