코코아에서 Document 기반 어플리케이션을 구현할 때 필요한 NSWindowController 구현 방안을 간단히 적어 본다.

문서 기반 멀티 윈도우 어플리케이션의 객체 구성
코코아의 Document 기반 어플리케이션에는 크게 새 종류의 클래스들이 구축된다.
- NSDocument
- NSWindowController
- NSDocumentController
NSDocument 는 말 그대로 어플리케이션의 주요 데이터를 담고 있어야 하기 때문에 모든 문서 기반 어플리케이션에서 필수적으로 구축해 주어야 하는 클래스이다.
두 번째로 언급한 NSWindowController 는 Document 창에서의 컨트롤러 역할을 하기 때문에 대부분의 경우 구축해 주어야 하는 클래스이다. NSWindowController 의 상속체는 nib 파일 내에서 Document 윈도우의 delegate 역할을 구현해 주기에도 좋다.
NSDocumentController 는 문서상으로는 대부분의 경우 구현하지 않는 것이 좋다고 하고 있다. 이 클래스는 새 문서를 만들거나 최근에 열었던 문서 관리 등 커스터마이즈 될 일이 별로 없는 일들을 수행하기 때문이다.
왼쪽 그림을 보면 NSDocumentController 를 최 상위로 두고, 그 아래로 NSDocument, Window Controller, 그리고 각 View 별 Controller 가 사용된다는 것을 알 수 있다.
또한, NSWindowController 는 한 개의 Document 가 가질 수 있는 윈도우들의 갯수만큼 구현될 수 있다. ( 많은 경우 하나의 Document 는 하나 이상의 윈도우에 의해서 표현될 수 있다. )
NSWindowController 의 구현 과정
1. NSWindowController 를 상속받는 빈 클래스를 생성한다.
2. Document 에 관련된 xib 의 file owner 를 상속받은 클래스로 변경해 준다.

3. NSDocument 의 구현체에서 makeWindowController 를 다음과 같이 상속받는다.
- (void) makeWindowControllers
{
memoWindowController = [[MemoWindowController alloc] initWithWindowNibName:[self windowNibName]];
[self addWindowController:memoWindowController];
[memoWindowController release];
}
document 의 xib 파일을 확인해 보면 윈도우 객체에 아래와 같이 delegate 가 설정되어 있는 것을 확인할 수 있다. 만약 delegate 가 설정되지 않은 경우에는 delegate 를 file owner 에 연결해서 상속받아 구현한 NSWindowController 를 document window 의 delegate 로써 활용할 수 있다.

상속받은 window controller 에서 관련 document 를 참조하기 위해서는 이미 구현되어 있는 멤버 함수인 document 를 이용하여 접근이 가능하다.
Recent Comments