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

标签 objective-c macos cocoa

我已经被困在这个问题上很长一段时间了,我在互联网上广泛搜索了解决方案... 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)

最佳答案

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

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

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

关于objective-c - NSWindow 不会在 OSStatus 事件处理程序方法中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050106/

相关文章:

ios - NSDateFormatter localizedStringFromDate dateStyle 结果

Objective-C 快速枚举搜索不会中断

ios - 如何从搜索栏和 UISearchDisplayController 的过滤结果中选择多个表行?

c - RabbitMQ-C 构建错误(使用 openSSL)

objective-c - ParseKit.framework 无法工作,找不到 Foundation.h

c++ - 如何在 OSX 上为 ncurses 提供鼠标支持?

Cocoa:获取应用程序可能的插件目录列表的正确方法?

cocoa - 将 PDF 渲染为高分辨率 NSImage 位图文件的方法

iOS 将 subview 添加到具有动态高度的 ScrollView

ios - -[__NSCFDictionary objectAtIndex :]: