2013-03-05 4 views
2

버튼을 클릭 할 때 팝업 메뉴가 표시됩니다.NSMenu 블로킹 타이머/글로벌 이벤트 모니터/

메뉴 표시하려면 : (팝업 전에 호출)

[_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

+0

우선, addGlobalMonitor ...는 다른 앱의 이벤트를 모니터링하는 데 사용됩니다. 타이머가 동일한 앱에서 실행되는 경우 어쨌든 그 메소드에 전달 될 것이라고는 생각하지 않습니다. addLocalMonitor ... : 메서드가 작동하지만 NSTimer의 내부 메커니즘이 확실하지 않습니다. addLocalMonitor에 대한 Apple 참조 문서 ... : "응용 프로그램을 통해 발송되는 이벤트 만 sendEvent : 메서드가 처리기로 전달됩니다"라고 명시되어 있습니다. NSTimer가 그 방법을 내부적으로 사용하는지 잘 모르겠습니다. 나는 알고 싶어 할 것입니다! – JiuJitsuCoder