CFRunLoopRunInMode 使用递归冻结主窗口



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

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

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, false(;

在区域设置循环内。 该函数在 0.01 秒后按预期返回,值为 kCFRunLoopRunTimedOut。 但是,在此期间,自定义 NSView 不再接收鼠标事件,因此我的应用程序看起来像是冻结了(彩色鼠标光标一圈又一圈地移动(。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新