2015-01-17 2 views
6

일단 타이머가 꺼지면 알람을 다시 시작하기 위해 실행되는 타이머가 있습니다.Swift에서 NSMenu가 열려있을 때 NSTimer가 실행되지 않음

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

셀렉터 기능은 모드 플래그를 설정하고, 새로운 분, 초 상수로 알람을 설정 원래의 함수를 호출하고, 또한 세션이 다시 시작 사용자 알림을 보냅니다. 이 비게되면

나는

그래서

enter image description here

내가 내 알람이 실제로 다시 시작 않음을 확인 열어 봤는데 남은 시간에 업데이트되는 메뉴 항목을 가지고 있고, 알림이 표시되는지 . 그것은 작동하지만 메뉴를 열었을 때 0으로 내려 가면 그냥 0시에 머물러 있습니다. 메뉴를 클릭하여 알림을 즉시 표시하고 의도 한대로 타이머를 재설정 할 때까지 타이머가 작동하지 않습니다. .

메뉴가 열려있을 때 타이머를 강제로 작동 시키려면 어떻게해야합니까? 큰 문제는 아니지만 사용자가 타이머를 내려다보고 있으면 세션이 멈추는 것을 혼동하지 않아야합니다.

답변

17
당신은 단지 다음과 같이 주요 runloop에 타이머를 추가해야

:

스위프트 이것은

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

3

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

스위프트 2.X 옳은. 기본적으로 공항 메뉴에서 정기적으로 SSID를 검색 할 때 확인할 수 있습니다. – uchuugaka

+1

특히, 실행 추적은 메뉴 추적 중에 'NSEventTrackingRunLoopMode'에서 실행됩니다. 타이머가 'NSDefaultRunLoopMode'에만있는 경우에는 실행되지 않습니다. 두 모드 모두 'NSRunLoopCommonModes' 세트에 있으므로, 그 의사 모드에 타이머를 추가하면 두 모드 모두에서 (다른 모드에서) 발사 할 수 있습니다. –

+0

완벽한 답변과 명확한 설명에 감사드립니다! –

관련 문제