2010-07-17 23 views
2

這實際上是一個兩部分的問題,希望我的解釋很明確:如何讓視圖內容的NSViewController取決於初始化的方式?

我有一個NSViewController可以配置爲在其視圖的一部分上顯示不同的自定義視圖。例如,其視圖可以顯示CustomViewA或CustomView B.

我能夠通過爲每個自定義視圖創建一個NSViewController並使用處理CustomViewA的NSViewController或處理CustomViewB的NSViewController初始化MyViewController來完成此工作。我使用NSBox並將其contentView設置爲由給定的NSViewController提供的視圖。

這種方法的問題是,我有一個NSBox的contentView將舉行「MyView」,然後在「MyView」我有另一個NSBox它將舉行CustomViewA或CustomViewB。

另一個問題是,我希望MyViewController處理CustomViewA和CustomViewB,而不是每個人都有一個單獨的NSViewController。

這是我目前的解決方案的示例代碼:

// How I initialize the NSViewControllers 
CustomViewControllerA* cvc = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil]; 
MyViewController* controller = [[MyViewController alloc] initWithCustomViewController:cvc nibName:@"MyView" bundle:nil]; 

//... 

// In Controller of main view 
- (void)awakeFromNib 
{ 
    // container is an NSBox* 
    [self.container setContentView:[self.myViewController view]]; 
} 

//... 

// In MyViewController 
-(void)awakeFromNib 
{ 
    // content is an NSBox* 
    [self.content setContentView:[self.customViewController view]]; 
} 

如何,我可以有我的CustomViewA和CustomViewB現場內MyView.nib二者均使用MyViewController作爲他們的控制器?

我怎麼能讓主視圖持有MyView而不是NSBox?

在此先感謝!

回答

0

試試這個:

// In MyViewController.m 
- (void) awakeFromNib { 
    [self.view addSubview:[self.customViewController.view]]; 
} 

和你MyViewController必須有一個參數,如:

// In MyViewController.h 
@interface MyViewController : NSViewController { 
    IBOutlet NSViewController* customViewController; 
} 
+0

謝謝,我會試試! 雖然有一個問題... MyViewController在用戶單擊按鈕時交換視圖。我只知道如何使用NSBox setCustomView來做到這一點: 在這種方法中,我如何交換用戶點擊的視圖?再次調用[self.view addSubview:...]? – 2010-07-17 19:27:02

+0

或多或少。您可以再次調用addSubview,但是您還需要在添加的原始子視圖上調用[NSView removeFromSuperview]。 – 2010-07-17 20:40:16

2

這裏是我可能會去設置此功能的方式。

@interface MyViewController : NSViewController 
{ 
    IBOutlet NSView* customView; //initially points to an NSBox or generic custom view from the nib file 
    CustomViewControllerA* viewControllerA; 
    CustomViewControllerB* viewControllerB; 
} 

@end 

@implementation MyViewController 

- (void)switchToCustomViewController:(NSViewController*)newCustomViewController 
{ 
    //Make sure the subview gets put in the right location 
    [newCustomViewController.view setFrame:customView.frame]; 
    [self.view replaceSubview:customView withView:newCustomViewController.view]; 
    customView = newCustomViewController.view; 
} 

//I usually use loadView in NSViewControllers rather than awakeFromNib, but either works 
- (void)loadView 
{ 
    [super loadView]; 
    viewControllerA = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil]; 
    viewControllerB = [[CustomViewControllerB alloc] initWithNibName:@"CustomViewB" bundle:nil]; 
    [self switchToCustomViewController:viewControllerA]; 
} 

@end 

所以,而不是將自定義視圖的NSBox裏面,這個設置將具有包括在筆尖作爲剛剛被刪除的第一次切換到的自定義視圖一個臨時佔位符的視圖。然後,當您想交換時,您只需撥打-switchToCustomViewController:即可與要切換到的控制器配合使用。從那時起,當你切換時,你只需將另一個自定義視圖交換爲MyViewController視圖的直接子視圖。如果您希望能夠指定哪一個應該是最初使用的那個,那麼只需創建一個init方法或可以設置爲告訴MyViewController哪個自定義視圖應該首先使用的簡單屬性即可。

+0

感謝您的提示。這可以正常工作,但自定義視圖的自動調整不適用於此方法。當我切換開關時,它會調整大小,因爲我正在設置框架。這是否意味着我必須每次都聽取視圖的大小調整並設置框架?如果是這樣的...將自定義視圖設置爲NSBox的contentView時,調整大小會自動生效。切換子視圖而不是使用NSBox並切換它的contentView有什麼好處嗎? – 2010-07-18 12:38:07

+0

只是想補充說我的視圖確實有「Autoresizes Subviews」標誌。在界面生成器中,我添加了一個NSBox到視圖來測試它是否會被調整大小,它是。只有以編程方式添加的子視圖不會自動調整大小。 – 2010-07-18 12:47:20

0

NSViewController並不是真正用於處理換入和換出的多個視圖。它主要用於處理從Nib/Xib加載的單個視圖,管理頂級對象的內存並提供便捷的綁定功能。正如您現在所做的那樣,典型的使用模型是爲每個視圖子類NSViewController。