CFRunLoopRunInMode使用递归冻结主窗口

时间:2017-06-17 20:02:10

标签: macos runloop

对于具有大量遗留代码的跨平台项目,我的Cocoa应用程序仅使用一个带有自定义NSView的NSWindow,它捕获所有鼠标事件并绘制我的所有应用程序图形细节。

我需要实现一个本地模态行为,所以我在主线程中使用:

CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.01,false);

在语言环境中。该函数在0.01秒后按预期返回,值为kCFRunLoopRunTimedOut。但是,鼠标事件在此期间不再被自定义NSView接收,因此我的应用程序看起来像是被冻结的(颜色鼠标光标是圆形的)。

计时器事件仍然会到达自定义NSView,但不会到达鼠标事件。

Apple指定可以递归调用此函数。还有什么我应该做的,以便NSView仍然接收用户鼠标输入?

1 个答案:

答案 0 :(得分:1)

事件循环建立在运行循环之上,但它不止于此。仅运行运行循环不足以接收和处理事件。

您可以通过围绕-[NSWindow nextEventMatchingMask:untilDate:inMode:dequeue:]-sendEvent:建立一个循环来实现您尝试做的一些事情,但实际上并不清楚您的目标是什么。如果你解释一下,可能有更好的方法。

例如,如果要呈现模式对话框,则应使用-[NSApplication runModalForWindow:]