我已经坚持了很长一段时间,我已经在互联网上搜索了一个解决方案...... 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)
答案 0 :(得分:1)
热键句柄函数是一个C函数而不是Objective-C实例方法,它没有“自”对象的概念。您已尝试通过声明self
局部变量来解决此问题,但它并未指向任何感兴趣的对象。相反,您已创建了一个新的不同对象,指向它,一个未连接到应用程序中其余对象的对象,并且没有将popUp
属性连接到任何东西(因为它是不是来自NIB)。
参考app委托应该有效。您确定应用程序对象的delegate
出口是否已连接到在NIB中实例化的应用程序委托对象?你可以稍后通过调用-setDelegate:
或分配给.delegate
属性来断开连接或重新连接吗?
通常,要将C样式的回调与面向对象的程序集成,需要安排将对象指针传递给C函数。幸运的是,热键回调签名适用于具有userData
参数的设计。注册回调时,应将对象指针指定为在调用时应传递给回调的用户数据。在回调中,您声明一个适当类型的对象指针变量并为其指定userData
(在ARC下,这需要__bridge强制转换)。
答案 1 :(得分:0)
它在awakeFromNib
但在其他地方打开的事实表明它实际上没有连线,但是窗口标记为“在启动时打开”,所以它恰好起作用。确保popUp
实际上不是nil
。