对于具有大量遗留代码的跨平台项目,我的Cocoa应用程序仅使用一个带有自定义NSView的NSWindow,它捕获所有鼠标事件并绘制我的所有应用程序图形细节。
我需要实现一个本地模态行为,所以我在主线程中使用:
CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.01,false);
在语言环境中。该函数在0.01秒后按预期返回,值为kCFRunLoopRunTimedOut。但是,鼠标事件在此期间不再被自定义NSView接收,因此我的应用程序看起来像是被冻结的(颜色鼠标光标是圆形的)。
计时器事件仍然会到达自定义NSView,但不会到达鼠标事件。
Apple指定可以递归调用此函数。还有什么我应该做的,以便NSView仍然接收用户鼠标输入?
答案 0 :(得分:1)
事件循环建立在运行循环之上,但它不止于此。仅运行运行循环不足以接收和处理事件。
您可以通过围绕-[NSWindow nextEventMatchingMask:untilDate:inMode:dequeue:]
和-sendEvent:
建立一个循环来实现您尝试做的一些事情,但实际上并不清楚您的目标是什么。如果你解释一下,可能有更好的方法。
例如,如果要呈现模式对话框,则应使用-[NSApplication runModalForWindow:]
。