NSTimer не запускается, когда NSMenu открыт в Swift
У меня есть таймер, который запускает, чтобы перезапустить будильник, как только он сработает.
alarm = NSTimer.scheduledTimerWithTimeInterval(
60 * minutesConstant + secondsConstant,
target:self,
selector: Selector("endSession"),
userInfo: nil,
repeats:false)
Его функция выбора устанавливает флаг режима и вызывает исходную функцию, которая устанавливает будильник с новыми константами минут и секунд, а также отправляет пользователю уведомление о перезапуске сеанса.
У меня есть пункт меню, который обновляется с оставшимся временем
Итак, я открывал его, чтобы проверить, что мой будильник действительно перезапускается и что уведомление отображается, как только оно достигает нуля. Это работает, но когда у меня есть открытое меню и оно падает до нуля, оно просто остается в 0:00, и таймер не срабатывает, пока я не нажму на меню, и в этот момент он немедленно показывает уведомление и сбрасывает таймер, как и предполагалось,
Как заставить таймер срабатывать при открытом меню? Это не имеет большого значения, но я не хочу, чтобы пользователь перепутал сессию, просто зависает, если он наблюдает, как таймер выключается.
2 ответа
Вам просто нужно добавить свой таймер в основной цикл запуска следующим образом:
Свифт 3
RunLoop.main.add(alarm, forMode: .commonModes)
Swift 2.x
NSRunLoop.mainRunLoop().addTimer(alarm, forMode: NSRunLoopCommonModes)
У меня была такая же проблема, но в MacOS с использованием NSOpenPanel. Моя проблема заключалась в том, что таймер, используемый для поддержания активности TCP, не срабатывал, и я терял связь со своими устройствами, если панель была открыта слишком долго. Мое приложение снова подключалось, как только я закрывал панель, но теперь оно находилось в неправильном состоянии. Простое добавление кода, рекомендованного выше, устранило проблему.
RunLoop.main.add(timer, forMode: .common)