1

我有一个应用程序打算在单击按钮时创建一个弹出窗口。弹出窗口将从 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:]

有人能告诉我我做错了什么吗?

谢谢

4

3 回答 3

3

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

尝试登录self-awakeFromNib

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

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

于 2012-02-15T03:49:24.403 回答
1

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

于 2012-02-15T03:59:11.193 回答
1

如果您从 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 来获取表格单元格视图。

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

于 2021-10-29T18:32:44.430 回答