2015-12-28 1 views
1

Я пишу приложение на основе NSDocument в Swift. Я установил его для открытия документа по умолчанию, если приложение не запускается с параметром документа.NSDocument, открывающий документ по умолчанию

Я заметил, что если я запустил приложение, а затем сразу открою другой документ, скажем, используя Open или Recent, документ по умолчанию Untitled останется, даже если он не тронут.

У меня создалось впечатление, что в этом рабочем документе документ Untitled считался «случайным» и должен быть удален. Это верно? Если это так, следует ли удалить это окно вручную или есть параметр, который я упустил?

+0

Что создавало впечатление, что документ Untitled будет считаться случайным? –

+0

Это было определено в Mac HIG с 1980-х годов. Открытые документы должны заменять неиспользуемые по умолчанию. –

ответ

1

Поведение, которое вы описываете, не является автоматическим. Пример того, как обращаться с этой ситуацией, см. В примере кода с открытым исходным кодом TextEdit. В частности, take a look при реализации -[DocumentController replaceTransientDocument:].

- (void)replaceTransientDocument:(NSArray *)documents { 
    // Transient document must be replaced on the main thread, since it may undergo automatic display on the main thread. 
    if ([NSThread isMainThread]) { 
     NSDocument *transientDoc = [documents objectAtIndex:0], *doc = [documents objectAtIndex:1]; 
     NSArray *controllersToTransfer = [[transientDoc windowControllers] copy]; 
     NSEnumerator *controllerEnum = [controllersToTransfer objectEnumerator]; 
     NSWindowController *controller; 

     [controllersToTransfer makeObjectsPerformSelector:@selector(retain)]; 

     while (controller = [controllerEnum nextObject]) { 
      [doc addWindowController:controller]; 
      [transientDoc removeWindowController:controller]; 
     } 
     [transientDoc close]; 

     [controllersToTransfer makeObjectsPerformSelector:@selector(release)]; 
     [controllersToTransfer release]; 

    // We replaced the value of the transient document with opened document, need to notify accessibility clients. 
    for (NSLayoutManager *layoutManager in [[(Document *)doc textStorage] layoutManagers]) { 
     for (NSTextContainer *textContainer in [layoutManager textContainers]) { 
     NSTextView *textView = [textContainer textView]; 
     if (textView) NSAccessibilityPostNotification(textView, NSAccessibilityValueChangedNotification); 
     } 
    } 

    } else { 
     [self performSelectorOnMainThread:_cmd withObject:documents waitUntilDone:YES]; 
    } 
} 

Если вы смотрите также на -openDocumentWithContentsOfURL:display:error: и несколько других мест, которые называют вышеупомянутый метод, вы получите хорошее представление о том, как они идут о замене «переходный документ» (далее «Без названия» документ) с открытый документ.

Надеюсь, это поможет.

+0

Действительно, я никогда раньше не сталкивался с этим. В то время как я здесь, я заметил, что новые приложения пропускают это полностью и обычно открываются вместо комбинации open/new. Если это предпочтительное поведение для новых приложений, есть ли способ перехватить это? Это не в NSDocument dox, который я читал. –

+0

Протокол NSApplicationDelegate предоставляет ссылку «открыть открытый документ». Это может быть хорошим местом, чтобы сказать «нет», и также представить открытый диалог. Я бы дал более конкретный код, но сейчас я не в месте. –

Смежные вопросы