2011-12-20 3 views
2

윈도우 (탭) 당 여러 개의 문서가있는 NSDocument 기반 앱에서 작업하고 있습니다. 이것은 내가 닫히기 전에 창에 속한 문서를 검토 할 수 있도록 창 닫기를 직접 처리해야한다는 것을 의미합니다. 이를 위해 standardWindowButton:NSWindowCloseButton을 사용하여 NSWindow의 닫기 버튼에 액세스하고 표준 (개인) _close: 메서드 대신이 버튼의 대상/동작을 내 메서드로 설정했습니다.스노우 레오파드에서 창 닫기 버튼 도용

이것은 라이온에서 잘 작동하지만 Snow Leopard에서는 문제가 발생합니다. 모달 대화 상자가 표시 될 때마다 닫기 버튼이 예상대로 비활성화됩니다. 그러나 모달 대화 상자가 닫히면 Snow Leopard에서 닫기 버튼이 다시 활성화되지 않습니다. 나중에 프로그래밍 방식으로 [closeButton setEnabled:YES] 등을 사용하여 다시 활성화하는 시도했지만 어떤 효과가없는 것 같습니다. 닫기 버튼의 타겟/액션을 변경했을 때만 이것이 발생한다는 것을 확인했습니다.

Snow Leopard에서이 동작을 피하는 방법에 대한 아이디어가 있습니까? 아니면 닫기 버튼을 하이재킹하는 다른 방법일까요? 툴바 버튼의 활성화 상태를 제어하는 ​​것은 무엇입니까? 어쩌면 거기에 무언가를 무효화 할 수 있을까요?

+1

대화 상자를 표시하고 대화 상자가 닫힐 때 추가하기 전에 대상과 동작을 제거하면 어떻게됩니까? –

+0

나는 그것을 시도했다고 생각했지만 지금은 그것을했고 그것이 효과가있는 것처럼 보입니다! 조금씩 까다 롭지 만 모든 다른 모달 대화 상자에 대해 대상/동작을 추가하고 제거해야하는시기를 정확히 찾아야합니다. 감사. – krill

답변

4

난 당신이 windowShouldClose 사용할 수 있다고 생각했을 것이다 : 위임 방법을

AppDelegate에에 창 대리자를 설정합니다. AppDelegate에서는 windowShouldClose : delegate 메서드를 사용하여 close 메서드를 호출하고 ,을 반환하여 창 닫기를 중지합니다. 당신의 방법으로 모든 점검을 한 다음 수행하십시오 : 창. 내보기 참조

NSWindow * thisWindow; //--pointer to window that will be closed 
BOOL windowClose;//-- bool for confirming close of window. 

- (BOOL)windowShouldClose:(id)sender{ 
    thisWindow =sender;//-- set thisWindow to the sender window,the one that is to be closed) 
    //if (sender ==theWindow) {//--you can use this to do further checking 

     if (windowClose) {//-- Close window if YES 
      return YES; 
     } 
    //} 


    [self performSelector:@selector(myCloseWindow) ];//go to your method 
    windowClose =FALSE;//-- reset 
    return NO;//do not close window here 
} 

- (void) myCloseWindow { 
    NSLog(@"closing window");//-- do your stuff 
    windowClose =TRUE;//--give the ok to close the window 
    [thisWindow performClose:thisWindow];//-- perform the close, which will be redirected back to the delegate, which will now allow the window to close 
} 
+0

이 기능은 작동 할 것으로 예상되지만,이 위임 메서드는 실제로 문서 기반 응용 프로그램의 창 닫기 단추와 동의어가 아닌 실제로 닫히기 전에 호출되기 때문에 호출되지 않습니다. 예를 들어 문서가 저장되지 않은 경우 문서 아키텍처는 창을 닫기 전에 문서를 저장하도록 사용자에게 요청하므로 너무 늦은 사용자를 잔소리 한 후에 만이 위임 메서드를 호출 할 수 있습니다. – krill