在 Swift 中打开 NSMenu 时 NSTimer 不触发

NSTimer not firing when NSMenu is open in Swift

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

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

它的选择器函数设置了一个模式标志,并调用了使用新的分钟和秒常量设置闹钟的原始函数,并且还发送了会话已重新启动的用户通知。

我有一个菜单项会随剩余时间更新

所以我一直在打开它来检查我的闹钟是否确实重新启动,以及一旦达到零就会显示通知。它可以工作,但是当我打开菜单并将其降至零时,它只会停留在 0:00 并且计时器不会触发,直到我单击菜单,此时它会立即显示通知并重置计时器像预期的那样。

如何在菜单打开时强制计时器启动?这没什么大不了的,但我不希望用户对会话挂起感到困惑,如果他们看到计时器倒计时。

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

Swift 4.2

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

Swift 3

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

Swift 2.x

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