objective-c - NSWindowController awakeFromNib 被调用两次

标签 objective-c macos cocoa nswindowcontroller

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

应用程序委托(delegate):

...

-(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:] 调用。

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

谢谢

最佳答案

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

尝试在 awakeFromNib 中记录 self -

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

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

关于objective-c - NSWindowController awakeFromNib 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287451/

相关文章:

iphone - iPhone 的 NSDistantObject 协议(protocol)

ios - 为什么在 dealloc 发生在另一个线程上时尝试创建对 self 的弱引用时我会崩溃?

objective-c - 我的套接字代码有什么问题?

javascript - IBM Informix NodeJS 设置问题 - INFORMIXSERVER 值未在 sqlhosts 文件或注册表中列出

将 Macos 升级到 Big Sur(v11.0.1) 后,Java 无法正常运行

ios - 函数签名特化 <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed>

mysql - macOS 上的 MAMP 或 MySQL

ios - 防止重复输入消息

objective-c - 局部变量、优化和 ARC

objective-c - 如何为自定义 NSWindow 制作动画