2012-04-06 2 views
0

저는이 문제에 상당히 오래 동안 고생했습니다. 인터넷에서 솔루션을 찾기 위해 광범위하게 검색했습니다 ... IB의 연결이 올바르게 설정되어 있습니다. 과 같이로 awakeFromNib 내 NSWindow 표시를 엽니 아무런 문제NSWindow가 OSStatus 이벤트 처리기 메서드에 표시되지 않습니다.

NSApp activateIgnoringOtherApps:YES]; 
[popUp makeKeyAndOrderFront:nil]; 

합니다. awakeFromNib에서 메서드를 호출하고 메서드에서 동일한 두 줄을 사용하여 창을 열 수도 있습니다.

문제는이 방법에서 발생하고 호출 어느 하나의 방식 - NSWindow 표시가 열리지 않습니다 : 당신이 볼 수 있듯이, 나는 두 가지 방법을 시도했습니다

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    GeronimoAppDelegate *self = [[GeronimoAppDelegate alloc] init]; 
    [self.popUp makeKeyAndOrderFront:nil]; 

    GeronimoAppDelegate *appDel = (GeronimoAppDelegate *)[NSApp delegate]; 
    [appDel.popUp makeKeyAndOrderFront:nil]; 

    //Run the timer method 
    [self runBackTimer]; 
    return noErr; 
} 

받는 참조하여 창을 열기로 appdelegate하여 NSWindow 객체에 액세스 할 수 있지만 둘 다 제대로 작동하지 않습니다. 이 메서드 또는 해당 메서드에서 호출 한 메서드에서 창을 열 수 있어야합니다. 내가 잘못 객체를 참조 할 수 있습니다? (이 방법들은 모두 같은 파일에 있습니다 - GeronimoAppDelegate.m)

답변

1

Objective-C 인스턴스 메소드가 아닌 C 함수 인 단축키 핸들 함수에는 "self"객체 개념이 없습니다. 로컬 변수 self을 선언하여이 문제를 해결하려했지만 관심 대상 개체를 가리 키지 않았습니다. 대신, 앱의 나머지 객체에 연결되지 않고 그 객체에 연결되어있는 popUp 속성이없는 새롭고 다른 객체를 만들어야합니다. 부리).

응용 프로그램 대리인을 참조하면 효과가있었습니다. 응용 프로그램 개체의 delegate 콘센트가 NIB에서 인스턴스화 된 응용 프로그램 대리인 개체에 연결되어 있습니까? 나중에 -setDelegate:을 호출하거나 .delegate 속성을 할당하여 다시 연결하거나 다시 연결할 수 있습니까?

일반적으로 C 스타일 콜백을 객체 지향 프로그램과 통합하려면 객체 포인터를 C 함수에 전달해야합니다. 다행히 단축키 콜백 시그니처는 userData 매개 변수를 사용하여 이러한 디자인을 수용합니다. 콜백을 등록 할 때 콜백 될 때 콜백으로 전달되어야하는 사용자 데이터로 객체 포인터를 지정해야합니다. 콜백에서 적절한 유형의 객체 포인터 변수를 선언하고 userData을 할당합니다 (ARC에서는 __bridge 캐스트가 필요함).

+0

그게 다야! 응용 프로그램 대리인에 연결된 응용 프로그램 개체의 대리자 콘센트가 없습니다. 너는 생명의 은인이야! 고마워. –

0

awakeFromNib에서 열리지 만 실제로는 유선이 아니지만 "시작시 열림"으로 표시되어 있기 때문에 발생합니다 일하다. popUp이 실제로 nil이 아닌지 확인하십시오.

+0

"시작시 표시"가 선택 해제되어 있으며 "popUp"NSWindow 객체 http://cl.ly/0N3p00323t2A0f0d2A1Q에 연결되어 있고 "[popUp makeKeyAndOrderFront : nil]"으로 열려면 awakeFromNib에 표시됩니다 ; " 그래서 연결이 잘되어야하며 OSStatus 메서드와 그 메서드에서 호출 된 것으로부터 예상 한대로 동작하는 것처럼 보입니다. –