首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次调用awakeFromNib方法

多次调用awakeFromNib方法
EN

Stack Overflow用户
提问于 2011-08-17 19:53:38
回答 7查看 9K关注 0票数 12

在我的基于NSPersistenDocument的项目中,我有一个这样的结构

代码语言:javascript
复制
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)

基本上,myResourceViewController是管理resourceView和数据的viewController的一个实例。

在myDocument的awakeFromNib方法中,我有以下代码

代码语言:javascript
复制
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    ...
    [leftBar addSubview:resourceViewController.view]; //i add resourceViewController's view 
    resourceViewController.view.frame = leftBar.bounds;
    ...
}

在myResourceViewController awakeFromNib方法中,我有:

代码语言:javascript
复制
-(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];
}

NSLog说同一个myResourceViewController实例的awakeFromNib被调用了4次,我不明白为什么。我唯一的ResourceViewController是在myDocument xib中创建的。我并不是到处使用NSNib加载方法。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-25 16:49:01

我找到了解决方案。每次NSOutlineView创建NSTableCellView时,都会调用awakeFromNib

票数 32
EN

Stack Overflow用户

发布于 2013-07-24 12:46:37

makeViewWithIdentifier方法的NSTableView头文件中描述了根本原因:“...请注意,每次实例化对象时,'owner‘都会得到一个'awakeFromNib:’调用。”

我的解决方案很简单,但我希望不是所有人都适用:只需将tabelView定义为owner:

代码语言:javascript
复制
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView *view = [tableView makeViewWithIdentifier:kTextViewIdentifier owner:tableView];

    return view;
}
票数 7
EN

Stack Overflow用户

发布于 2011-08-17 20:01:35

我不知道为什么它被调用了四次,但至少我可以解释两次awakeFromNib调用。重要的是要记住,即使是nib文件的文件所有者也会调用awakeFromNib,而不仅仅是nib文件中包含的对象。

因此,ResourceViewController的awakeFromNib至少会被调用两次:一次是在myDocument.xib中加载,另一次是从另一个nib加载由ResourceViewController管理的视图。

最好在其他方法中执行初始化,这些方法在更确定的时间调用,比如...didLoadapplicationDidFinish...

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7092366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档