2013-03-05 24 views
2

單擊按鈕時顯示一個彈出菜單。問題是,當菜單打開時,計時器不再起作用:NSMenu阻塞計時器/全局事件監視器/ etc

顯示菜單:

[_menu popUpMenuPositioningItem:nil atLocation:point inView:nil]; 

我的定時器(彈出前調用)不再發送郵件的按鈕被點擊後, 。

[NSTimer scheduledTimerWithTimeInterval:0.50 
           target:self 
           selector:@selector(myMethod:) 
           userInfo:nil 
           repeats:YES]; 

也曾嘗試[NSEvent addGlobalMonitorForEventsMatchingMask ..],甚至CGEventTapCreate。什麼都不會被調用

如何使彈出窗口不阻塞/模態?我知道這是可能的,我已經看到另一個應用程序這樣做。感謝您的任何想法。

回答

1

問題可能是NSTimer未在正確的模式下運行。嘗試通過創建NSRunLoop對象來抓取當前運行循環。然後使用方法addTimer:forMode :(在您剛剛創建的運行循環對象中)將您的計時器添加到NSModalPanelRunLoopMode。你可以在這裏的Apple Docs中閱讀更多關於它的文章:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html

+0

謝謝,就是這樣,儘管我必須將它設置爲NSEventTrackingRunLoopMode。我覺得很奇怪,儘管我的NSEvent addGlobalMonitorForEventsMatchingMask:雖然不起作用,因爲我認爲它可以在同一個runloop上工作。 – Wesley 2013-03-05 22:37:40

+0

那麼,首先,addGlobalMonitor ...應該用於監視其他應用程序中的事件。如果計時器在同一個應用程序中觸發,我認爲它無論如何都不會傳遞給該方法。 addLocalMonitor ...:方法可能工作,但我不確定NSTimer的內部機制。 addLocalMonitor ...的Apple Reference Docs:明確聲明「只有通過應用程序sendEvent:方法分派的事件纔會傳遞給您的處理程序」。我不確定NSTimer是否在內部使用該方法。但我很想知道! – JiuJitsuCoder 2013-03-06 15:30:38