2009-12-07 4 views
7

특히 텍스트 필드 포커스와 관련하여 불일치하게 동작합니다.LSUIElement가 activateIgnoringOtherApps와 일치하지 않게 동작합니다.

LSUIElement에 상태 메뉴가 있습니다. 이 메뉴에는 텍스트 필드가 포함 된보기가 있습니다. 텍스트 필드는 선택 가능해야합니다. 기본적으로 선택되지는 않지만 어느 것이 든 선택됩니다. 상태 항목을 클릭하면

, 그것은

[NSApp activateIgnoringOtherApps:YES]; 

를 트리거 그리고, 절반의 시간을 작동합니다. * 상태 메뉴는 "백그라운드에서"자체를 고려하는 것 같다 나머지 절반와 못하게 텍스트 필드를 클릭해도 초점을 맞 춥니 다. (상태 항목 클릭 트리거가 b/c를 실행 중임을 알고 있습니다.)

Apple에서 이러한 상태 항목을 처리하는 방식의 버그입니까, 아니면 ActivIgnoringOtherApps의 mishandling입니까?

* 실제로 다른 앱이 활성화 된 후에 처음으로 실패하는 것으로 보입니다. 그 후 그것은 잘 작동합니다.

전체 조각 :

-(void)statusItemClicked:(id)sender { 
    //show the popup menu associated with the status item. 
    [statusItem popUpStatusItemMenu:statusMenu]; 

    //activate *after* showing the popup menu to obtain focus for the text field. 
    [NSApp activateIgnoringOtherApps:YES]; 

} 

답변

0

나는 당신이 당신의 텍스트 필드가 들어있는 메뉴를 팝업 한 후 activateIgnoringOtherApps:를 호출 할 필요가 경험에서 알고있다. 이 위해 그것을 할 필요가있을 것이다 그래서 : 그것은 처음 활성화하기 아니에요 있도록 응용 프로그램이 너무 늦게 활성화처럼 당신이 말한 한 내용을 바탕으로

- (void)statusItemClicked:sender { 
    [statusItem popUpStatusItemMenu:theMenu]; 
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication] 
} 

, 그것은 소리 당신은 항목을 클릭 후속 클릭에서 이미 활성화되어 있습니다.

+0

분명히 너무 늦게 활성화되었지만 제안 된대로 코드가 이미 구조화되었습니다. 거의 활성화 메소드가 상태 메뉴가 닫힐 때까지 호출되지 않는 것처럼 보입니다 (NSLog 테스트는 이것을 감당할 것 같습니다). 나는 그것이 왜 일어날 지 이해하지 못합니다. – iconmaster

+0

'activateIgnoringOtherApps :'는'popUpStatusItemMenu :'의 직후에 호출 되나요, 아니면 메뉴가 닫힐 때까지 돌아 오지 않습니까? 중단 점을 설정하고 디버거를 통해 실행하여 어떤 일이 발생하는지 확인할 수 있습니다. – Alex

+0

그래, 중단 점을 사용하면 메뉴가 닫힌 후에야 확실히 호출됩니다. 첫 번째 게시물에 내 코드를 추가합니다.하지만 내 의견은 제안과 거의 같습니다. – iconmaster

2

마지막으로 이에 대한 해결 방법이 생겼습니다. 지연은 눈에 보이지하지만 긴 있도록

-(void)pop:(NSTimer *)timer { 
    [statusItem popUpStatusItemMenu:theMenu]; 
} 

-(void)statusItemClicked:sender { 
    [NSApp activateIgnoringOtherApps:YES]; 
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO]; 
} 

pop:가 다음 프레임에서 호출됩니다

하는 대신 클릭 처리기에서 메뉴 터지는의 앱이 다음 메뉴를 팝업 지연없이 함께 NSTimer 일정을 활성화 activateIgnoringOtherApps:은 같은 프레임에서 메뉴를 팝업 할 때 예상대로 작동하지 못하게하는 모든 작업을 수행하기에 충분합니다.