NSWindow不会在OSStatus事件处理程序方法中显示

时间:2012-04-06 22:46:55

标签: objective-c macos cocoa

我已经坚持了很长一段时间,我已经在互联网上搜索了一个解决方案...... IB中的连接设置正确,我可以在awakeFromNib中打开我的NSWindow,如下所示:< / p>

NSApp activateIgnoringOtherApps:YES];
[popUp makeKeyAndOrderFront:nil]; 

没有问题。我也可以从awakeFromNib调用一个方法,并在方法中使用相同的两行打开窗口。

问题出现在这种方法以及从中调用的任何方法中 - NSWindow将无法打开:

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData)
{ 
    GeronimoAppDelegate *self = [[GeronimoAppDelegate alloc] init];
    [self.popUp makeKeyAndOrderFront:nil];

    GeronimoAppDelegate *appDel = (GeronimoAppDelegate *)[NSApp delegate];
    [appDel.popUp makeKeyAndOrderFront:nil];

    //Run the timer method
    [self runBackTimer];
    return noErr; 
}

正如你所看到的,我已经尝试了两种方法来打开窗口,通过引用appdelegate来访问NSWindow对象,但两种方法都没有用。我需要能够从这个方法或从它调用的方法打开窗口。我可能错误地指对象? (所有这些方法都在同一个文件中 - GeronimoAppDelegate.m)

2 个答案:

答案 0 :(得分:1)

热键句柄函数是一个C函数而不是Objective-C实例方法,它没有“自”对象的概念。您已尝试通过声明self局部变量来解决此问题,但它并未指向任何感兴趣的对象。相反,您已创建了一个新的不同对象,指向它,一个未连接到应用程序中其余对象的对象,并且没有将popUp属性连接到任何东西(因为它是不是来自NIB)。

参考app委托应该有效。您确定应用程序对象的delegate出口是否已连接到在NIB中实例化的应用程序委托对象?你可以稍后通过调用-setDelegate:或分配给.delegate属性来断开连接或重新连接吗?

通常,要将C样式的回调与面向对象的程序集成,需要安排将对象指针传递给C函数。幸运的是,热键回调签名适用于具有userData参数的设计。注册回调时,应将对象指针指定为在调用时应传递给回调的用户数据。在回调中,您声明一个适当类型的对象指针变量并为其指定userData(在ARC下,这需要__bridge强制转换)。

答案 1 :(得分:0)

它在awakeFromNib但在其他地方打开的事实表明它实际上没有连线,但是窗口标记为“在启动时打开”,所以它恰好起作用。确保popUp实际上不是nil