gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:58:33 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com