我在自定义NSTimer
中有一个NSView
。计时器设置为始终以特定间隔重复,一旦触发,计时器应更新一组视图参数。
这一切都很好但是,当视图失焦时(即右键单击工具栏以拉出菜单),计时器会延迟,并且在视图失焦时不会触发。
我的问题是,即使视图失焦,我如何确保计时器始终触发并更新视图参数?
答案 0 :(得分:4)
当您执行某些事件(例如显示上下文菜单)时,运行循环将进入事件跟踪模式。这意味着只会处理某些事件。要在运行循环处于此模式时触发计时器,请在计时器的模式列表中包含NSEventTrackingRunLoopMode。
NSTimer *timer = [NSTimer timerWithTimeInterval:theInterval target:theTarget selector:theSelector userInfo:theUserInfo repeats:shouldRepeat];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
答案 1 :(得分:0)
一个可能的解释:
计时器触发,事件按时添加到队列中。但是,AppKit的大部分都不是线程安全的......所以直到下一次运行循环迭代才会看到更新。哇,事件被阻止,因为事件都通过主运行循环/线程传输。
有意义吗?
注意:为了使问题更加复杂,异步绘图对于OS x来说是相当新的(在NSView级别),因此请确保测试要支持的操作系统的所有主要版本。结果/行为会有所不同。