OSX 10.10应用程序无法获得焦点或事件循环

时间:2015-05-27 15:31:19

标签: objective-c macos focus event-loop

中断15年后重新启动应用程序开发。当前项目是将旧的Windows类型命令行实用程序转换为交互式OS X窗口应用程序。 我在主窗口中创建了一个视图委托,可以绘制和更新NSTable视图。 更新是在App的主循环中生成的,它采用UDP / TCP流,通过适当的委托解析和更新视图。

问题在于:当我运行应用程序时,主窗口显然没有 焦点(左上角的窗口控制按钮是灰色的),从我的.xib创建的菜单是惰性的,窗口本身不响应调整大小或在表格视图滚动条内鼠标命中。此外,鼠标指针是在App窗口上方的旋转沙滩球。

我的猜测是我没有为Objective C运行循环提供时间来进行事件处理。我发送了一个"显示"我的应用程序循环的每次迭代都在我的窗口,但我想这还不够(Apple在发送这种更新消息时不清楚哪些对象得到了什么消息)。我是在正确的轨道上吗?

有没有办法让系统事件循环每次都通过我的app主循环运行迭代?

谢谢!

更新:我尝试在我的应用主循环中明确提供事件循环时间:         [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];

应用行为没有明显变化。

2 个答案:

答案 0 :(得分:0)

  

我的猜测是我没有为Objective C运行循环提供时间来进行事件处理。

在这种情况下,我建议您阅读提供并发性的Grand Central Dispatch,以便GUI保持响应。

对GCD here有一个很好的解释,虽然它看起来像一个庞大而复杂的主题,但你可能只需要几行代码就可以使用GCD。例如: -

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{  
    // do some work    
});

答案 1 :(得分:0)

尽管比较了我的代码和新创建的.xib原型之间的笔尖和连接,但我没有理由让我的代码无法获得焦点。

解决方法是使用新的.xib将我的代码内容移动到项目中。 这有效但不满意