2015-01-17 15 views
6

Ho un timer che funziona per riavviare un allarme quando si spegne.NSTimer non si attiva quando NSMenu è aperto in Swift

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

sua funzione selettore imposta un flag di modalità, e chiama la funzione originale che impostare l'allarme con nuovi minuti e secondi costanti, e invia una notifica all'utente che la sessione è riavviato.

Ho una voce di menu che viene aggiornato con il tempo rimanente

enter image description here

così mi è stato aprirlo per controllare che il mio allarme effettivamente riavvia, e che la notifica mostra una volta che raggiunge lo zero . Funziona, ma quando ho il menu aperto e scende fino a zero rimane solo alle 0:00 e il timer non si attiva finché non faccio clic fuori dal menu, a quel punto mostra immediatamente la notifica e ripristina il timer come previsto .

Come posso forzare il timer a sparare quando il menu è aperto? Non è un grosso problema, ma non voglio che l'utente sia confuso con la sessione si blocca solo se guardano il timer andare giù.

risposta

17

Basta aggiungere la timer per il runloop principale come segue:

Swift 3

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

2.x Swift

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

Questo è corretta. È fondamentalmente ciò che è possibile vedere nel menu dell'aeroporto durante la scansione periodica degli SSID – uchuugaka

+1

In particolare, il ciclo di esecuzione viene eseguito in 'NSEventTrackingRunLoopMode' durante il monitoraggio del menu. Se il tuo timer è solo in 'NSDefaultRunLoopMode', non si attiva. Entrambe queste modalità sono nel set 'NSRunLoopCommonModes', quindi aggiungere il timer a quella pseudo-modalità gli permette di sparare in entrambi i casi (e altri). –

+0

Perfetto, grazie per la risposta e una chiara spiegazione! –

Problemi correlati