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)
Другие вопросы по тегам