OSX 10.10 应用程序没有获得焦点或事件循环
Posted
技术标签:
【中文标题】OSX 10.10 应用程序没有获得焦点或事件循环【英文标题】:OSX 10.10 App doesn't get focus or event loop 【发布时间】:2015-05-27 15:31:19 【问题描述】:在中断 15 年后重新开始应用开发。当前项目是将旧的 windows 类型的命令行实用程序转换为交互式 OS X 窗口应用程序。 我在主窗口中创建了一个视图委托,可以绘制和更新 NSTable 视图。 更新在应用程序的主循环中生成,该循环采用 UDP/TCP 流,通过适当的委托解析和更新视图。
问题是:当我运行应用程序时,主窗口显然没有 焦点(左上角的窗口控制按钮是灰色的),从我的 .xib 创建的菜单是惰性的,并且窗口本身不会响应调整大小或在表格视图滚动条内的鼠标点击。此外,鼠标指针在应用程序窗口上方时是旋转的沙滩球。
我的猜测是我没有为 Objective C 运行循环提供时间来处理事件。我确实在我的应用程序循环的每次迭代中都会向我的窗口发送一个“显示”,但我想这还不够(Apple 不太清楚在发送这种更新消息时哪些对象会收到哪些消息)。我在正确的轨道上吗?
有没有办法让系统事件循环每次通过我的应用程序主循环运行一次迭代?
谢谢!
更新:我尝试在我的应用程序的主循环中明确提供事件循环时间: [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
应用行为没有明显变化。
【问题讨论】:
需要查看main
的代码。也就是说,你通常会得到一个指向 [NSApplication sharedApplication]
的指针来设置它的委托,然后告诉它到 run
。
嗨史蒂夫。谢谢!我的 Main 是通用的: int main(int argc, const char * argv[]) return NSApplicationMain(argc, argv);
为了确保我的代码没有搞砸,我在 AppDelegate 中插入了这个无限循环,作为 AppicationDidFinishLauncing 中的第一件事:while (TRUE) [self.window display]; [self.window makeKeyAndOrderFront:nil]; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 同样,主窗口行为没有变化。我还向主窗口发送了一个 make 键和前端消息 - 再次没有效果,仍然没有焦点并且主菜单处于非活动状态。
所以现在我相信我必须以某种方式将 .xib 连接搞砸了,作为一个仅使用 XCODE 生成的 Xib 的裸应用程序,任何用户代码都不应该有这些行为。我的主窗口有一个指向 App Delegate 的引用出口。 Appdelegate.h 声明了一个 outlet 属性。该主窗口内的视图没有指定的出口或操作。
如果您在 main.m 中使用 NSApplicationMain
,您需要在 info.plist 中设置正确命名的 Main Nib。 main[menu] nib 的文件所有者应该是应用程序。 See the answer here for more。我以为你在做一些更不标准的事情,但听起来你刚刚破坏了沼泽标准流程中的一个链接。而且很难从中恢复过来。当我处于你的阶段时,我会放弃整个项目并将代码转储到新的项目中,因为链接很模糊。
【参考方案1】:
我的猜测是我没有为 Objective C 运行循环提供时间来处理事件。
在这种情况下,我建议您阅读Grand Central Dispatch,它提供并发性,允许 GUI 保持响应。
GCD here 有一个很好的解释,虽然它看起来像一个庞大而复杂的主题,但您可能只需要几行代码就可以使用 GCD。例如:-
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
// do some work
);
【讨论】:
感谢 TDK 的回复!如果你看看我上面的回复,我基本上已经把我所有的代码都缩短为最简单的 OS X GUI,只是一个 Xcode 生成的主窗口,里面有一个 View。在应用启动时,唯一运行的代码是运行 0.1 秒的 Run 循环片段的循环。仍然无法获得焦点。现在我想我一定是无意间改变了与 xib 的连接,但看起来我认为应该如此。窗口参考。插座连接到 AppDelegate。有什么想法吗?我认为这个最基本的事件处理级别应该被纳入。【参考方案2】:尽管比较了我的代码和新创建的 .xib 原型之间的 nib 和连接,但我找不到我的代码没有获得焦点的理由。
解决方法是使用新的 .xib 将我的代码内容移到项目中。 这可行,但不令人满意
【讨论】:
以上是关于OSX 10.10 应用程序没有获得焦点或事件循环的主要内容,如果未能解决你的问题,请参考以下文章
javascript脚本事件,窗体失去焦点事件怎么写,怎么触发事件????
SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good