2013-01-23 55 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

哈!你不同意写它的人。那么......你有权得到你自己的意见。我所说的只是“一般”不应该使用。我发现使用它的人有更多的问题,并且不明白为什么以及何时被调用。 –

相关问题