2012-08-06 49 views
1

在我的项目中有一个xib文件,其文件所有者被设置为NSViewController的子类。这个xib文件有一个NSView,里面有一个基于视图的NSTableView。 NSViewController子类实现了协议NSTableViewDelegate,并且在IB中,NSTableView的委托连接到文件的所有者。当通过绑定创建视图,该的viewController的awakeFromNib方法被调用这个调用堆栈:NSTableView的委托在创建行时收到awakeFromNib消息

#0 0x000000010000584b in -[TheViewController awakeFromNib] 
#1 0x00007fff890f9bd8 in -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]() 
#2 0x00007fff893101d6 in -[NSNib _instantiateNibWithExternalNameTable:]() 
#3 0x00007fff89310c7a in -[NSNib instantiateNibWithExternalNameTable:]() 
#4 0x00007fff892bcac4 in -[NSTableRowData _unarchiveViewWithIdentifier:owner:]() 
#5 0x00007fff892be57b in -[NSTableView(NSTableViewViewBased) makeViewForTableColumn:row:]() 
#6 0x00007fff892be1b2 in -[NSTableRowData _addViewToRowView:atColumn:row:]() 
#7 0x00007fff892bde7f in -[NSTableRowData _addViewsToRowView:atRow:]() 
#8 0x00007fff892bc415 in -[NSTableRowData _addRowViewForVisibleRow:withPriorView:]() 
#9 0x00007fff892bc19a in -[NSTableRowData _addRowViewForVisibleRow:withPriorRowIndex:inDictionary:withRowAnimation:]() 
#10 0x00007fff892bb469 in -[NSTableRowData _unsafeUpdateVisibleRowEntries]() 
#11 0x00007fff892bb001 in -[NSTableRowData updateVisibleRowViews]() 
#12 0x00007fff892930fb in -[NSTableView viewWillDraw]() 
#13 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#14 0x00007fff884d50b6 in __NSArrayEnumerate() 
#15 0x00007fff8917092d in -[NSView viewWillDraw]() 
#16 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#17 0x00007fff884d50b6 in __NSArrayEnumerate() 
#18 0x00007fff8917092d in -[NSView viewWillDraw]() 
#19 0x00007fff891fb455 in -[NSScrollView viewWillDraw]() 
#20 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#21 0x00007fff884d50b6 in __NSArrayEnumerate() 
#22 0x00007fff8917092d in -[NSView viewWillDraw]() 
#23 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#24 0x00007fff884d50b6 in __NSArrayEnumerate() 
#25 0x00007fff8917092d in -[NSView viewWillDraw]() 
#26 0x00007fff89247e0d in -[NSBox viewWillDraw]() 
#27 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#28 0x00007fff884d50b6 in __NSArrayEnumerate() 
#29 0x00007fff8917092d in -[NSView viewWillDraw]() 
#30 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#31 0x00007fff884d50b6 in __NSArrayEnumerate() 
#32 0x00007fff8917092d in -[NSView viewWillDraw]() 
#33 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#34 0x00007fff884d50b6 in __NSArrayEnumerate() 
#35 0x00007fff8917092d in -[NSView viewWillDraw]() 
#36 0x00007fff89170bed in __22-[NSView viewWillDraw]_block_invoke_0() 
#37 0x00007fff884d50b6 in __NSArrayEnumerate() 
#38 0x00007fff8917092d in -[NSView viewWillDraw]() 
#39 0x00007fff8916ff84 in -[NSView _sendViewWillDrawInRect:clipRootView:]() 
#40 0x00007fff8913c3f1 in -[NSView displayIfNeeded]() 
#41 0x00007fff891f93f8 in -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:]() 
#42 0x00007fff891f8a18 in -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:]() 
#43 0x00007fff891f85ff in -[NSWindow orderWindow:relativeTo:]() 
#44 0x00007fff890f9c96 in -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]() 
#45 0x00007fff890d8b7d in loadNib() 
#46 0x00007fff890d80a9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]() 
#47 0x00007fff890d7ede in -[NSBundle(NSNibLoading) loadNibNamed:owner:topLevelObjects:]() 
#48 0x00007fff890d7cbe in +[NSBundle(NSNibLoading) loadNibNamed:owner:]() 
#49 0x00007fff890d447f in NSApplicationMain() 
#50 0x0000000100001432 in main 

的awakeFromNib方法,不仅要在以后的viewController被称为实例化?

+0

也看到了这一点。真的很烦人。 – 2013-03-11 15:25:17

回答

1

好像从我的经验,每当有新的观点是从厦门国际银行文件加载任何厦门国际银行文件File's Owner将收到-awakeFromNib消息。正如您注意到的那样,当基于视图的表视图从xib文件创建新行时会发生这种情况。

而且我知道没有办法阻止这种情况的发生,除了可能记录多少次您调用awakeFromNib并仅在第一次执行初始化代码时。

或者更好的是,把你的初始化逻辑在具有更坚实的时序另一种方法 - 例如在-loadView之后,致电super。我这样做:

- (void)loadView { 
    [self vvViewWillLoad]; 
    [super loadView]; 
    [self vvViewDidLoad]; 
} 

- (void)vvViewDidLoad { 
    ... // initialization material here 
} 
+0

根据文档,这是真实的:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/#//apple_ref/occ/instm/NSTableView/makeViewWithIdentifier:owner: – 2015-06-23 10:08:15