2011-08-02 5 views
2

SDI (Single Document Interface) 문서 기반 코코아 응용 프로그램을 만드는 방법이 있습니까? 사용자가 여러 문서를 한꺼번에 열지 않기를 바랍니다.단일 문서 인터페이스 문서 기반 코코아 응용 프로그램

+0

왜 이걸 원하니? 열려있는 단일 문서 만 지원하는 것은 일반적으로 권장되지 않으므로 그렇게하는 것이 쉽지 않습니다. –

+0

내가 작성한 응용 프로그램은 GarageBand와 같은 음악 소프트웨어입니다. 한 번에 하드웨어에 액세스하는 데 제한이 있으므로 사용자가 여러 노래 파일을 한 번에 열지 못하게 할 수 있습니다. –

답변

0

Cocoa 응용 프로그램 템플릿을 기반으로 새로운 Xcode 프로젝트를 만들어 원하는 UI를 얻을 수 있어야합니다. "문서 기반 응용 프로그램 만들기"를 선택 취소하십시오.

자신이 열기/저장 명령을 작성하고 수업을 NSDocument 및 친구들과 변경해야하지만 할 수 있어야합니다.

3

이렇게해도 좋지만 나쁘지 않습니다.

일반적인 접근 방법 : 앱의 xib 인 싱글 톤 NSWindowController에 자신을 첨부해야하는 NSDocument를 사용하십시오. 문서가 열리지 않으면 그 창에 다른 것들이있을 수도 있습니다.


당신은을 사용하는 다른 창을 제거 : 내가 플레이의 모든 NSDocument 기능을 유지으로이 디자인 등등 ... 여기

좀 더 세부 간다, 나를 위해 좋은 작품 새 창이므로 Xcode에서 만든 앱 템플리트의 기본 항목을 제거하십시오. 아마도 MainMenu.xib에서 그 모든 것을 제거하거나 새 xib로 옮길 것입니다.

(는 사용자가 볼 항상 것입니다 우리의 주요 창처럼) 당신의 미래 NSWindowController

그냥 나중에 우리는 그것에 더 많은 방법을 추가 할 것입니다, 테스트를위한 자리를 만들위한 새로운 XIB (창)를 만듭니다.

자신의 NSWindowController를 만들고, 그것을

그래서, 당신의 NSWindowController 안에, 당신의 XIB (한 번), 복귀가 호출이 하나의 싱글 언제든지로드 싱글 랩퍼를 작성 싱글합니다. 이

당신의 NSDocument 기반 문서로이 같은 추가 만이 단일 창에 부착하도록 https://gist.github.com/1057420

+ (id) singletonInstance { 
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{ 
     return [[self alloc] initWithWindowNibName:@"yourxibfilename"]; 
    }); 
} 

이 NSDocument 수정 : 나는 더 많은 정보를 원하시면 여기를 보면, 도우미 타입 #define을 사용했다. 기본적으로 당신은 가지고있는 싱글 톤 윈도우를 사용하도록 문서에 지시 할 것이고 NSWindowController 내부의 내부 setDocument는 그것이 보여주고있는 기존의 NSDocument를 대체하기 위해 자동으로 호출되어야합니다.
- (void)makeWindowControllers { 
    ReceiptDocumentWindowController *wc = [ReceiptDocumentWindowController singletonInstance]; 
    [self addWindowController:wc]; 
} 

그냥 배회하지 않습니다 확인하기 위해 가까이에 NSWindowController에서 NSDocument을 제거하는 것이 좋습니다. 나는 이것이 어떤 경우에는 필요하다고 생각하지 않지만, 이것을 잘 조사 할 수도 있습니다. 그래서, 또한 NSDocument 문서 내부 :

- (void)close { 
    [self removeWindowController:[ReceiptDocumentWindowController singletonInstance]]; 
    [super close]; 
} 

테스트 - 당신은 지금과

이있을 것입니다 몇 가지 문제를 작업 프로토 타입 솔루션을해야한다, 그 모두는 당신의 정확한 요구 사항에 따라 달라집니다.

먼저, 새로운 NSDocumentController를 사용하여 열려있는 모든 문서를 자동으로 닫은 다음 새 문서를 여는 것이 좋습니다.이것에 대해 더 많이 연구해야합니다.

내가 언급 한 NSViewController로 돌아가서 "현재 열려있는 문서"로 업데이트하는 방법. NSWindowController에 NSWindowController에 몇 가지 접착제를 넣어 setDocument를 열어 모든 다운 스트림 IBOutlet에 연결된 xib 인스턴스 (예 : NSViewController)에 첨부 할 문서를 첨부합니다. 좋아,이 같은 : 이제

- (void)setDocument:(NSDocument *)lDocument { 
    [super setDocument:lDocument]; 
    if (lDocument != nil && self.receiptDetailViewController != nil) 
     self.receiptDetailViewController.representedObject = lDocument; 
} 

, 내 NSDocumentViewController에서 표현 된 객체는 NSViewController.representedObject에 코코아 바인딩을 사용하여 바인딩보기가 있습니다. 그래서 빙고, 내 물건을 마법과 거의 비슷하게 만듭니다. 이렇게 캡슐화하는 것이 좋습니다. 그러면 xib의 뷰가있는 문서를 표시하는 데 중점을 둘 수 있으며 열려있는 모든 문서에 대한 참조가있는 NSViewController를 사용할 수 있습니다.

이것이 명확하지 않으면 알려주십시오. 더 많은 코드를 게시 할 예정입니다. 행운을 빈다. 도움이되는지 알려 주시기 바랍니다.

마커스 윌리 포드

+0

깔끔한 조언을 해주셔서 감사합니다. 나는 이것을 나중에 시험해 볼 것이다! –

관련 문제