2013-01-23 54 views
3

我創建了一個NSTableCellView的子類來做一些自定義繪圖。該表的內容是通過綁定到一個NSArrayController獲得的,因此,當新數據添加到NSArrayController時,我的NSTableCellView子類的新實例會自動創建。創建新實例時,我需要一些代碼才能運行一次,因此我認爲它應該在init之後。我實現了init和initWithFrame(見下文),但是在創建子類的新實例時(即在控制檯中沒有看到我的NSLog消息),這兩者似乎都不會被調用。我應該使用不同的init方法嗎?NSTableCellView子類的指定初始值設定項是什麼?

- (id)init { 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
     NSLog(@"init"); 
    } 
    return self; 
} 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
     NSLog(@"init with frame"); 
    } 
    return self; 
} 
+1

它們是如何創建的;編程或作爲加載NIB的一部分? – trojanfoe

+0

我不直接創建它們,它們是在新對象添加到綁定表的NSArrayController時創建的。我更新了我的問題以包含此信息。 –

回答

7

要回答你的問題,指定的初始值爲initWithFrame :.但是,如果一個視圖在NIB中編碼(就像在這種情況下),則調用initWithCoder:。你必須重寫該方法。

請勿使用awakeFromNib;一般來說,它可能會比你期望的頻率更高,而且我看到它給人們帶來麻煩。

但是,執行單元初始化的好地方是在表視圖中委託方法viewForTableColumn:row: - 仍然可以使用它並使用綁定。

corbin (我寫過這個課)。

+0

我不同意這個答案,也awakeFromNib:可以被覆蓋。 –

+2

哈!你不同意寫它的人。那麼......你有權得到你自己的意見。我所說的只是「一般」不應該使用。我發現使用它的人有更多的問題,並且不明白爲什麼以及何時被調用。 –

相關問題