2010-02-23 49 views
1

我正在製作一個應用程序,它在許多不同的上下文中包含相同的按鈕組。這些按鈕會將其操作發送到每個上下文中的不同對象。我希望能夠在包含按鈕的IB中設計一個單獨的NSView,然後能夠在保持鏈接的同時將該視圖的副本放在筆尖的很多位置,以便更改傳播。我想將這些實例中的每一個連接到不同的對象,並讓按鈕將其操作發送到其父視圖所連接的任何對象。可重複使用的接口位,設計在IB

我想創建一個NSView的子類,它在加載時用另一個從nib文件加載的視圖替換自己,將連接的對象設置爲文件的所有者,但我不相信這是最乾淨的方法。這是我的實現這個想法(哪個 - 工作):

@implementation AVNViewFromNib 

- (void)awakeFromNib 
{ 
    //Load the nib whose name is specified by the "nibFile" key 
    NSNib* viewNib = [[NSNib alloc] initWithNibNamed:[self valueForKey:@"nibFile"] bundle:[NSBundle mainBundle]]; 
    NSMutableArray* topLevelObjects = [NSMutableArray new]; 
    [viewNib instantiateNibWithOwner:relatedObject topLevelObjects:&topLevelObjects]; 

    //Find our replacement view in that nib 
    for (id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:NSClassFromString(@"AVNReplacementView")]) 
     { 
      representedView = currentObject; 
      break; 
     } 
    } 

    //Copy appropriate properties from us to our representedView 
    [representedView setAutoresizingMask:[self autoresizingMask]]; 
    [representedView setFrame:[self frame]]; 
    [[self superview] addSubview:representedView]; 

    //We were never here. :) 
    [self removeFromSuperview]; 
    [viewNib autorelease]; 
} 

@end 

@implementation AVNReplacementView 
@end 

這是最乾淨的方法?有沒有一個標準的方法來解決這個問題?

回答

1

您可以使用IB中的按鈕創建視圖,然後將該視圖拖入庫窗口並保存。問題是,它們之間沒有「聯繫」。編輯一個不會改變其他人的任何內容。

如果你想這樣做,你需要改爲創建一個NSView的子類。

我想創建一個NSView的子類,加載時,替換其本身與它從榫文件加載另一個視圖,設置連接對象作爲文件擁有者,但我不相信這是最乾淨方法。

這可以工作。我不認爲這真的很骯髒; init方法返回對象的原因是它們顯式地可以返回不同的對象。但是,我不確定你如何處理不同幀的視圖,因爲加載的視圖將具有它在nib中的任何幀。

另一種方法是從一個筆尖加載按鈕,但是在將它們添加爲子視圖之前,您必須調整它們的框架。

+0

令人討厭的是,它沒有保留一個鏈接(但想到它會如何)。但只是一個真棒小費!謝謝彼得! – bladnman 2011-08-11 17:24:24