2013-08-19 5 views
2

첫 번째 NSDocument 기반 응용 프로그램을 만들고 있습니다. 새로운 파일을 처음부터 새로 만들거나 레거시 파일을 가져 와서 만들 수 있습니다.NSDocument 하위 클래스 인스턴스가 응답 체인에 없습니다.

이 응용 프로그램은 문서 당 여러 개의 창을 허용하므로 makeWindowControllers를 무시합니다. 이 방법은 현재 매우 간단하다 :

- (void) makeWindowControllers 
{ 
    if (documentDatabase == nil) return; 
    DataSheetWindowController * dswc = [[DataSheetWindowController alloc] initWithDatabase:documentDatabase]; 
    [self addWindowController: dswc]; 
} 

창은 예상대로, 그러나, 저장, 저장으로 되돌리기 및 문서가 리스폰 더 체인에없는 것처럼 다른 문서 활성화 메뉴가 비활성화되어 나타납니다. 실험으로

, 내 NSWindowController 클래스에이 방법을 추가하는 시도 :

- (void)saveDocument:(id)sender { 
    [[self document] saveDocument:sender]; 
} 

장소에이 방법, 저장 메뉴 항목이 활성화되고이를 선택하면 문서의 저장 메서드가 호출되게된다.

설명서 및 Stack Overflow에 관한 다른 질문을 읽으면서 뭔가 잘못되었다는 것이 확실합니다.이 메서드를 NSWindowController 클래스에 넣으면 안됩니다. 나는 어리석은 것을 간과 한 것이 틀림 없다. 그러나 나 자신의 삶에 대해 그것이 무엇인지, 또는이 문제에 대한 다른 언급이나 웹상의 다른 곳을 언급 할 수 없다.

유용한 추가 정보 - IB에서 창 소유자 및 대리인은 NSWindowController로 설정됩니다. 응답자 체인 (How to inspect the responder chain? 참조)을 표시하는 방법을 만들었지 만 문서가 나열되지 않았습니다. 다음은 응답 체인의 결과입니다 (NSDocument는 NSResponder의 하위 클래스가 아니기 때문에 어쨌든 나열되어 있어야하는지 확실하지 않습니다). 나는 NSWindowController 클래스에 넣어 saveDocument 방법은 윈도우 컨트롤러가이 문서에 연결되어 있는지 알 수 있습니까 나에게 나타냅니다, 작업을 수행하기 때문에

RESPONDER CHAIN: 
<NSClipView: 0x102344350> 
<NSScrollView: 0x102344480> 
<NSView: 0x102345040> 
<NSWindow: 0x10234e090> 

.

그래서 응답 체인에 문서가없는 것처럼 문서가 작동하는 이유는 무엇입니까?

업데이트 된 정보 : 내가 isDocumentEdited가 true를 돌려주는 것을 확인했다

[self updateChangeCount:NSChangeDone]; 

: 새 문서를 설정 한 후 initWithType 방법은 문서 상태가 편집되어 있는지 확인하기 위해이 임시 라인을 포함한다. 내가 솔루션이 하나가 제안거야

+0

문서 클래스에서'validateMenuItem :'을 대체하면, 호출됩니까? 저장을 위해 부름 받았습니까? 저장을 위해 호출되면 '슈퍼'는 무엇을 반환합니까? –

+0

좋은 질문입니다. 난 그냥이 시도하고, NSDocument 내 하위 클래스에 배치 된 경우 validateMenuItem 전혀 호출되지 않습니다. –

+0

'validateMenuItem' 또는'validateMenuItem :'? 'validateMenuItem'을 호출하는 것은 아무것도 없지만 유효성을 검사 할 메뉴 항목과 함께'validateMenuItem :'이 호출됩니다. (정확히 구현하고 싶습니다.) –

답변

3

여기에 지적 :

https://stackoverflow.com/a/9349636/341994

을 펜촉에 윈도우 컨트롤러가로드됩니다 창을 포함하는 파일의 소유자 프록시 할 필요가 (파일의 소유자 프록시를 선택하고 확인/구성하기 위해 ID 관리자를 검사하십시오), 창 콘센트를 창에 연결하고 창 대리자 콘센트를 File 's Owner 프록시에 연결해야합니다 (File 's 소유자 프록시를 열고 연결 관리자에서이를 확인하십시오.

관련 문제