多次调用awakeFromNib方法

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.

  • @Mazyod解决方案是不要在`makeViewWithIdentifier:owner:`中将`owner`设置为`self` (9认同)
  • 这是一种解决方法,但我在init中设置了BOOL initialize = NO,然后只在initialize = NO时在awakeFromNib中执行代码(并在if语句中将其设置为YES) (4认同)
  • 非常真气,有谁知道如何制止这个? (3认同)

Ste*_*han 6

根本原因在方法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)

  • 在加载原型视图时,可以简单地为所有者传递nil. (2认同)