0

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

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

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, false);

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

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

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

4

1 回答 1

1

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

-[NSWindow nextEventMatchingMask:untilDate:inMode:dequeue:]您也许可以通过围绕and构建一个循环来实现您想要做的一些事情-sendEvent:,但实际上并不清楚您的目标是什么。如果您对此进行解释,则可能有更好的方法。

例如,如果你想呈现一个模态对话框,你应该使用-[NSApplication runModalForWindow:].

于 2017-06-17T20:37:57.123 回答