在Swift中打开NSMenu时,NSTimer未击发

bttbmeg0  于 2022-11-28  发布在  Swift
关注(0)|答案(2)|浏览(89)

我有一个计时器,一旦闹钟响了,它就会重新启动。

alarm = NSTimer.scheduledTimerWithTimeInterval(
    60 * minutesConstant + secondsConstant,
    target:self,
    selector: Selector("endSession"),
    userInfo: nil,
    repeats:false)

它的选择器函数设置一个模式标志,并调用原始函数,该函数使用新的分钟和秒常量设置闹钟,还向用户发送会话已重新启动的通知。
我有一个菜单项,它会根据剩余时间进行更新

所以我一直在打开它来检查我的闹钟是否真的重新启动了,并且一旦它达到零,通知就显示出来了。它工作正常,但是当我打开菜单,它下降到零,它只是停留在0:00,计时器不会触发,直到我点击菜单,在这一点上,它立即显示通知,并重置计时器像预期的那样。
当菜单打开时,我如何强制触发计时器?这不是什么大问题,但我不希望用户在看到计时器下降时,混淆了会话挂起。

n1bvdmb6

n1bvdmb61#

您只需将计时器添加到主运行循环中,如下所示:

雨燕4.2

RunLoop.main.add(timer, forMode: .common)

雨燕3

RunLoop.main.add(alarm, forMode: .commonModes)

斯威夫特2.x

NSRunLoop.mainRunLoop().addTimer(alarm, forMode: NSRunLoopCommonModes)
vpfxa7rd

vpfxa7rd2#

我遇到了同样的问题,但是在MacOS中使用NSOpenPanel。我的问题是用于TCP保持活动的计时器不会触发,如果面板打开太长时间,我会失去与设备的连接。我的应用程序会在我关闭面板后重新连接,但现在处于错误状态。只需添加上面推荐的代码就可以解决这个问题。

RunLoop.main.add(timer, forMode: .common)

相关问题