2012-07-31 95 views
1

我已經構建了一個自定義NSView。基本上,對於我選擇的樹視圖中的每個項目,我想將視圖與另一個交換。使用NSTreeView交換視圖

我的問題是,我應該使用類似NSArrayController這樣的東西?如果是這樣,你如何掛鉤自定義NSView使用NSArrayController 基於NSTreeView中的選擇視圖之間的交換?

回答

2

你可以使用一個NSArrayController做到這一點但有一對夫婦的積分,您必須考慮:

每個NSView應該由NSViewController進行控制,因此,你從最好存放一些標識在NSArrayController您可以扣除控制器類和關聯的NIB。一旦擁有NSViewController類名稱,就可以實例化它,並使用initWithNibName:方法加載伴隨的視圖。

介紹「電流控制器」的概念可能是一個好主意。這樣,您在任何時候只能在內存中擁有一個控制器(以及相關的視圖和模型對象圖)。一旦您根據樹視圖中的選擇交換控制器,舊的控制器及其所有關聯的對象將從內存中釋放。

例子:

  • 存儲在您NSArrayController@"Customers"
  • 控制器類:@"CustomersViewController"
  • 相關NIB:@"CustomersView"

通過陣列中存儲@"Customers"可以抵扣了正確的控制器班級名稱和相關的NIB:

NSString *aControllerName = [anIdentifier stringByAppendingString: @"ViewController"]; 
NSString *aNibName = [anIdentifier stringByAppendingString: @"View"]; 
Class aControllerClass = NSClassFromString(aControllerName); 
[self setCurrentController: [[aControllerClass alloc] initWithNibName: aNibName bundle: [NSBundle mainBundle]]]; 

在上面的代碼anIdentifier將保留值@"Customers"並可能源自您的NSArrayController。上例中的self指您的頂級控制器(其類取決於您的設計)。

實際觀看交換可以做如下:

[[self currentController] view] removeFromSuperView]; 
... do swapping ... 
[[self view] addSubview:[[self currentController] view]]; 

如果存儲的標識符與填充你的樹視圖中的數據源,你可能不會需要一個單獨的NSArrayController,你就可以直接坐樹視圖中所選對象的標識符。