0

我已经坚持了很长一段时间,我已经在互联网上广泛搜索了一个解决方案...... IB 中的连接设置正确,我可以像这样在 awakeFromNib 中打开我的 NSWindow:

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 中)

4

2 回答 2

1

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

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

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

于 2012-04-07T06:07:11.593 回答
0

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

于 2012-04-07T00:23:28.480 回答