2012-10-30 36 views
2

我需要一個視圖,其中將包含滑塊和按鈕等控件,並具有彩色背景。我不確定是否要繼承NSViewNSViewController。我以爲我可以繼承NSView並繪製自定義背景並在xib中佈置控件,並將網點設置爲NSView子類。子類NSViewController或NSView

有些按鈕需要切換,如播放/暫停按鈕,我想這個邏輯應該在NSView來完成,當按鈕切換,而不是NSViewController有管理撥動它的自我NSViewController通知。

但是當我去創建一個NSView子類時,創建xib的選項變灰,它只能用NSViewController。所以我必須在NSViewController上有網點嗎?

我想myView.playPauseButton,但它似乎我必須有myViewController.playPauseButton

回答

-1

它最好用子類NSViewController和init的子類,或者在代碼中手動佈局子視圖。根據我的經驗,NSView的子類化從來沒有像我想要的那樣,包括你正在尋找的實現。

3

我需要一個視圖,其中將包含滑塊和按鈕等控件,並具有彩色背景。我不確定是否繼承NSView或NSViewController。我想我可以繼承一個NSView並繪製自定義背景並在xib中佈置控件,並將出口設置爲NSView子類。

如果你想使用xib,你必須使用NSViewController子類;這就是它的目的,除其他外。

通常,對於您正在嘗試做的事情(將多個控件捆綁在一起),NSViewController是要使用的類。你也可以從模型 - 視圖 - 控制器模式(這是視圖控制器和視圖的來源)的角度看到這一點:視圖與事物的顯示方式有關;控制器必須處理用戶交互(以及與模型的交互)。

你當然可以定義一個NSView子類,並以編程方式或在IB中定義其內容(將滑塊和按鈕添加爲子視圖),但除此之外沒有多大優勢,除非您打算提供一種特定的控制。

編輯:

在你想使用使用自定義評論您的狀態,IB定義NSView一個NSSplitView內。這使事情變得更具情境化。

現在,像往常一樣有許多設計選項,例如,您可以定義自己的MySplitController,允許您指定應從中加載拆分視圖子視圖的筆尖。但是,如果我正確理解你的目標,你想要做的是在xib中定義一個NSView並在NSSplitView中使用它,就像它是IB允許的默認視圖類型之一一樣。

這是Interface Builder Plug-ins允許的。不幸的是,它們似乎在Xcode 4中不再受到支持。

然後我看到的唯一選擇是定義一個子類的NSView,例如MyCustomView然後在其initWithFrame:方法加載XIB文件,識別您在它定義的視圖,並且將其添加爲子視圖。

具體而言,您可以使用此代碼加載廈門國際銀行文件的頂級對象,其中自定義視圖就會發現:

NSNib *nib = [[[NSNib alloc] initWithNibNamed:@"MyView" bundle:nil] autorelease]; 
NSArray *topLevelObjects; 
if (![nib instantiateWithOwner:customViewOwner topLevelObjects:&topLevelObjects]) { 
    //- handle error 
} 

MyView *myView = nil; 
for (id topLevelObject in topLevelObjects) { 
    if ([topLevelObject isKindOfClass:[MyView class]) { 
    myView = topLevelObject; 
    break; 
    } 
} 

爲了簡化問題,你可以有這個廈門國際銀行文件只定義自定義NSView和無處不在的文件所有者(這是將視圖集成到應用程序其餘部分的鏈接)。

如您所見,我將customViewOwner傳遞給instantiateWithOwner:這將是您的主視圖控制器或應用程序委託負責響應來自自定義視圖的所有操作並在需要時設置其狀態。這個類將是你的xib的文件所有者,所以要有一個真正的模塊化設計,最好定義你在特定項目中繼承的MyCustomViewController

一旦你定義這樣一個自定義的NSView子類,那麼你需要做的唯一的事情將它集成到你的NSSplitView是NSSplitView的子視圖類型設置爲MyCustomView

這不像使用IB插件那麼簡單,但它可以很好地用於集成在不同xib文件中定義的視圖。

+0

所以我已經subclassed NSViewController,添加我的控件在界面生成器(在一個單獨的筆尖到主窗口的xib),我如何將視圖控制器的視圖添加到主筆尖窗口? –

+0

在您的應用程序委託中,您實例化自定義視圖控制器(並將其存儲到強大的屬性中),然後將'myController.view'作爲子視圖('addSubview:')添加到窗口中。 – sergio

+0

所以它不能在IB中完成? –