2013-10-09 5 views
0

NSSavePanel을 하위 클래스로 만드는 방법이 있는지 궁금합니다. 또는 더미 객체를 만드는 경우 NSSavePanel의 beginSheetModalForWindow : CompletionHandler 함수를 어떻게 모방합니까?NSSavePanel을 서브 클래스화할 수 있습니까?

-(void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger *))handler{ 

.m 클래스 파일에서 함수를 구현할 때 블록 처리기를 구현하는 방법에 대해서는 설명하지 않습니다.

+1

실제로 달성하려는 것은 무엇입니까? 왜 NSSavePanel을 하위 클래스로 만들려고합니까? –

+0

플러그인이 반환되어야하는 플러그인으로 작업하십시오. 주로 NSSavePanel에서 시작 시트 모드 윈도우를 다시 만들고 싶습니다. – Dan68am

+1

@ Dan68am - "블록 처리기 구현 방법"이란 무엇입니까? 블록을 취하는 메소드를 작성하면 표준 함수 호출 구문을 사용하여 블록을 호출하는 메소드에서 블록을 "구현"하지 않습니다. – CRD

답변

3

짧은 답변 : 없음

긴 답변 : 여기에 드래곤

그것은 가능하지만 물건은 아마 중단됩니다합니다. 범주를 사용하여 메소드를 추가 할 수도 있으며, 작동 할 수도 있고 그렇지 않을 수도 있습니다. 문제는 NSOpenPanel이 App Sandbox를 지원하기 위해 구현되는 방식으로 발생합니다. 다양한 chicanery가 뒤에서 진행되고 클래스의 기존 메소드를 호출하는 편의 카테고리 메소드조차도 OS X 및 대화 상자에서 오류가보고 될 수 있습니다. 나타나다. NSOpenPanel은 아주 조심스럽게 가능한 한 작게 만져야하는 섬세한 생물입니다.

다른 클래스에서 NSOpenPanel 인스턴스를 래핑하는 것은 다른 이야기이며 전혀 화나게하지 않아야합니다. 그 길로가.

부록 재 :

- (void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger result))handler 

완료 핸들러 눌린 버튼을 나타내는 값을 전달되는 : beginSheetModalForWindow의 선언은

주석. 표준에 따라 조치를 취하려면 if :

NSOpenPanel *openPanel; 
NSWindow *hostWindow; 
... 
[openPanel beginSheetModalForWindow:hostWindow 
        completionHandler:^(NSInteger returnCode) 
            { 
             if (returnCode == NSFileHandlingPanelOKButton) 
             { 
              // OK pressed 
              ... 
             } 
             else 
             { 
              // Cancel pressed 
              ... 
             } 

            } 
]; 
+0

일반적인 질문에 대답했기 때문에이 질문에 답을 할 것입니다. 내 문제인 인수로서 블록 방법을 잘 이해하지 못했다고 생각한다. 취소 버튼을 누르거나 NSOKButton을 할 때 완료 핸들러가 무언가를 수행하기를 원합니다. 그래서'if (handler == NSOKButton) {'뭔가를하십시오. – Dan68am

+0

@ Dan68am - 추가 정보 HTH가 추가되었습니다. – CRD

+0

깊이있는 대답에 감사드립니다. 이 점을 훨씬 잘 이해하는 데 도움이됩니다. – Dan68am