Luc*_*tti 12 cocoa binding objective-c interface-builder xib
在我的基于NSPersistenDocument的项目中,我有一个这样的结构
myDocument (NSPersistentDocument) -> myDocument.xib (windows xib)
|
|-> view (the self.view) --> ... "other view"
|
|-> some NSArrayController
|
|-> myResourceViewController --> myResourceViewController.xib
|
|-> view (the self.view)
|
|-> myTreeController (a NSTreeController subclass)
Run Code Online (Sandbox Code Playgroud)
基本上,myResourceViewController是viewController的一个实例,它管理resourceView并管理它们的数据.
在myDocument的awakeFromNib方法中,我有以下代码
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
...
[leftBar addSubview:resourceViewController.view]; //i add resourceViewController's view
resourceViewController.view.frame = leftBar.bounds;
...
}
Run Code Online (Sandbox Code Playgroud)
在myResourceViewController awakeFromNib方法我有:
-(void)awakeFromNib;
{
NSLog(@"%@", [self description]);
[removeButton bind:@"enabled" toObject:resourceTreeController withKeyPath:@"selection" options:[NSDictionary dictionaryWithObject:NSIsNotNilTransformerName forKey:NSValueTransformerNameBindingOption]];
NSArray *draggedTypes = [NSArray arrayWithObjects:ResourceURIPasteBoardType, nil];
[resourceOutlineView registerForDraggedTypes:draggedTypes];
}
Run Code Online (Sandbox Code Playgroud)
NSLog说,myResourceViewController的同一个实例的awakeFromNib被称为4次,我不明白为什么.我唯一的ResourceViewController是在myDocument xib中创建的.我到处都不使用NSNib加载方法.
Luc*_*tti 31
我找到了解决方案.awakeFromNib每次NSTableCellView创建时都会调用NSOutlineView.
根本原因在方法makeViewWithIdentifier的NSTableView头文件中描述:"....注意,'owner'将在每次实例化对象时获得'awakeFromNib:'调用."
我的解决方案很简单,但我希望不适合所有人:只需将tabelView定义为所有者:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSTableCellView *view = [tableView makeViewWithIdentifier:kTextViewIdentifier owner:tableView];
return view;
}
Run Code Online (Sandbox Code Playgroud)