【问题标题】:NSWindowController awakeFromNib is being called twiceNSWindowController awakeFromNib 被调用了两次
【发布时间】:2012-02-15 03:26:25
【问题描述】:

我有一个应用程序,它打算在单击按钮时创建一个弹出窗口。弹出窗口将从 nib 文件加载。因此,单击按钮并愉快地弹出窗口。但是,它的 awakeFromNib 方法被调用了两次。这是代码;

应用代理:

...

-(IBAction)myButton:(id)sender{

    printf("[settings]: button pressed\n");

    Config_SelectorSetup *selectorSetup = [[Config_SelectorSetup alloc] initWithWindowNibName:@"Config_SelectorSetup"];

    printf("about to load\n");

    [[selectorSetup window] makeKeyAndOrderFront:sender];

}

Config_SelectorSetup.m

- (id) initWithWindowNibName:(NSString *)windowNibName{

    printf("[initWithWindowNibName]\n");

    if( self = [super initWithWindowNibName:windowNibName] ){

        ...

    }

    return self;

}

- (void)awakeFromNib{

    printf("[awakeFromNib]\n");

    [self startScreen];
}

这是输出:

[settings]: button pressed
[initWithWindowNibName]
about to load
[awakeFromNib]
[awakeFromNib]

分析调用栈,第一次被[NSObject performSelector:]调用,第二次被[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]调用。

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

    标签: objective-c macos cocoa nswindowcontroller


    【解决方案1】:

    除了文件所有者之外,Config_SelectorSetup.xib 是否包含 Config_SelectorSetup 对象?

    尝试在awakeFromNib 中记录self -

    NSLog(@"self = %p", self);
    

    每次都打印相同的地址吗?如果它打印不同的地址,您的笔尖中可能有一个Config_SelectorSetup 对象。

    【讨论】:

    • 那么你应该打开一个包含相关细节的新问题。
    【解决方案2】:

    您的班级有多少个网点,该班级的子类是什么?我发现对于某些子类(例如NSDocument),如果您连接了多个插座,每个 nib 对象将在加载时触发awakeFromNib 方法。 NSLog你的 outlet 看看他们输出的是 nil 还是地址。

    【讨论】:

      【解决方案3】:

      如果你从一个 nib 创建一个对象并将 NSWindowController 指定为所有者,则窗口控制器将获得一个 awakeFromNib。 例如,一个常见的情况是控制器是 NSTableView 和方法的委托

      (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
      

      正在制作这样的视图,

      return [tableView makeViewWithIdentifier:tableColumn.identifier
                                                            owner:self];
      

      注意 self(窗口控制器)是如何作为所有者传递的,这将导致它在每次执行此行时看到一条 awakeFromNib 消息。 在这种情况下,最好将 nil 作为所有者传递,而不是依赖 awakeFromNib 来获取表格单元格视图。

      我不知道在您的情况下,您的控制器指定为所有者正在创建什么对象,但这应该会让您走上正确的轨道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 2015-01-19
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多