2013-05-02 1 views
2

나는 NS(Persistent)Document이 있습니다.자동 저장된 문서가 자동으로 열릴 때 init 및 windowControllerDidLoadNib : 메서드가 호출되지 않는 이유는 무엇입니까?

Xcode를 통해 응용 프로그램을 실행 한 다음 데이터없이 새 문서를 만든 다음 응용 프로그램을 종료합니다. 내가 엑스 코드 내 응용 프로그램을 다시 실행하면이 경우 , 나는 그 이전의 문서가 자동으로 열려, initwindowControllerDidLoadNib: (가)

라는 것을 확인할 수 있습니다. 그러나 init도 아니고 windowControllerDidLoadNib:도 호출되지 않았는지 확인할 수 있습니다.

왜 그렇습니까?

+0

"NSDocument"가 "어딘가에 저장되어 있기 때문에"init 메소드 등을 통해 "다시 생성"할 필요가 없을 수도 있습니다. – Colas

답변

7

당신이보고있는 것은 window restoration입니다. 이 문서 (문서 기반 응용 프로그래밍 가이드의 일부)는 다음과 같이 설명합니다.

문서 아키텍처는 창 복원 프로세스에서 다음 단계를 구현합니다. 단계는 그림 5-2에 표시된 숫자에 상관 관계 :

  1. 공유 NSDocumentController 객체의 클래스에 문서 윈도우의 복원 클래스를 설정 setDocument:NSWindowController 방법. NSWindow 개체는 상태가 변경 될 때마다 invalidateRestorableState을 보냄으로써 복원 가능 상태를 무효화합니다.
  2. 다음 적절한시기에 Cocoa는 an encodeRestorableStateWithCoder: message 창을 보내고 식별 및 상태 정보를 전달 된 인코더로 인코딩합니다.
  3. 시스템이 다시 시작되면 Cocoa는 앱을 다시 실행하고 restoreWindowWithIdentifier:state:completionHandler: 메시지를 NSApp 개체로 보냅니다.

    애플 리케이션은이 방법을 재정 의하여 새로운 복원 클래스를 대체하거나 별도의 번들에서로드하는 등의 창 복구에 필요한 일반 작업을 수행 할 수 있습니다.

    NSApp [이 경우에, 문서 제어기의 급 - 피터] 복원 클래스 객체 the restoreWindowWithIdentifier:state:completionHandler: message를 전송 윈도우의 복원 클래스를 디코딩하고 YES를 반환한다.

  4. 복원 클래스는 문서를 다시 열고 창을 찾습니다. 그런 다음 전달 된 완료 핸들러를 윈도우를 매개 변수로 호출합니다.
  5. 코코아는 the restoreStateWithCoder: message을 창으로 보냅니다.이 창은 전달 된 NSCoder 개체에서 복원 가능한 상태를 디코딩하고 해당 콘텐츠의 세부 정보를 복원합니다.
[그림 5-2, 뷰, 다른 대응하고, 문서를 저장 및 복원받을 것을 설명하는 단락도]

응용 프로그램이 재발되어

는, 코코아는 관련에 restoreStateWithCoder: 메시지를

를 전송 개체를 차례로 : NSApplication 개체로, 다음에 각각 NSWindow 개체로, 다음으로 NSWindowController 개체로, 다음으로 NSDocument 개체로, 그리고 나서 저장된 상태를 갖는 각보기로 이동합니다.

은 문서 관련이 아닌 창에도 사용되지만 문서 기계는 대부분 사용자에게 더러운 작업을 처리합니다.창 복원의 양면 (아마도 양면)에서 무엇인가를해야하는 경우 문서에서 encodeRestorableStateWithCoder:restoreStateWithCoder:을 무시하십시오. 전자는 선택과 같은 일시적인 정보를 저장하는 곳이고 후자는 부활 된 문서와 창에서 해당 정보를 복원하는 곳입니다.

코더의 존재는이 당신에 의존한다 (창 복원의 맥락에서) 문서화 된 사실은 아니지만 문서가 아니라 initinitWithCoder:를 사용하여 초기화되는 것을 의미한다.

+0

'NSPersistentDocument'에서 응용 프로그램이 저장되지는 ​​않았지만 자동 저장된 문서 인 경우 NSPersistentDocument로 보내는 메시지는'restoreDocumentWindowWithIdentifier : state : completionHandler :'입니다. 이 방법을 재정 의하여 일부 버그를 방지하는 것이 좋습니다. 알아 둘만한 ! – Colas

+0

@Colas : NSPersistentDocument에만 국한된 것은 아닙니다. 그것은 NSDocument에 정의되어 있습니다. 내가 인용 한 가이드가 그것을 버렸음에 흥미 롭다. –

관련 문제