递归使用的 CFRunLoopRunInMode 冻结主 window

CFRunLoopRunInMode used recursively freezes the main window

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

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

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, false);

在语言环境循环中。函数 returns 在 0.01 秒后如预期的那样具有 kCFRunLoopRunTimedOut 的值。但是,在那段时间自定义 NSView 不再接收鼠标事件,因此我的应用程序看起来像被冻结了(彩色鼠标光标一圈又一圈)。

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

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

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

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

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