2017-09-05 51 views
1

我創建了XIBInitWithCoder從來沒有要求可可基於NSView的類

我創建了這個類,名爲MyCustomView,並將其分配給XIB的文件所有者。

- (instancetype)initWithCoder:(NSCoder *)aDecoder{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) [self load]; 
    return self; 
} 

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) [self load]; 
    return self; 
} 

- (void)load { 

    NSArray* topLevelObjects; 
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" 
           owner:self 
         topLevelObjects:&topLevelObjects]; 

    NSView* view; 
    for (id aView in topLevelObjects) { 
    if ([umaVista isKindOfClass:[NSView class]]) { 
     view = umaVista; 
     break; 
    } 
    } 

    [self addSubview:view]; 
    view.frame = self.bounds; 

} 

我在主應用上創建了一個NSView

我將該視圖更改爲MyCustomView

我運行該應用程序。 MyCustomViewinitWithCoder不運行。 initWithFrame不運行。 awakeFromNib不運行。

沒有任何反應。

任何想法?

+0

你的意思是「將它分配給XIB的第一響應者」?你不能「分配」任何東西給第一響應者,這是代表動態第一響應者值的代理項目。 –

+0

你是什麼意思?這就是網絡上的所有教程。 – SpaceDog

+0

你的意思是你將它分配給「文件所有者」? –

回答

1

「文件所有者」as I've written elsewhere,不是存檔中的真實對象。這是一個佔位符。當拆開筆尖包裝時,會使用預先存在的物體。

它看起來像你應該把你的自定義視圖的實例放入筆尖。不要讓它成爲File's Owner,只需從對象選​​項板中拖出一個視圖,然後在Identity Inspector(右窗格,頂部;按⌘-⌥-3)中更改它的類。在筆尖也建立子視圖。

然後讓您的NSBundle爲您加載筆尖。您的自定義視圖將獲得initWithCoder:awakeFromNib,您不必通過層次結構來查找特定的子視圖。

+0

好的謝謝。我去做! – SpaceDog