NSDocument открытие поверх документа по умолчанию

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

Я заметил, что, если я запускаю приложение, а затем сразу же открываю другой документ, скажем, с помощью "Открыть" или "Недавние", документ по умолчанию без названия остается, даже если его нетронутым.

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

1 ответ

Поведение, которое вы описываете, не является автоматическим. Для примера того, как справиться с этой ситуацией, см. Пример кода TextEdit с открытым исходным кодом. В частности, посмотрите на -[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: и в нескольких других местах, которые вызывают вышеупомянутый метод, вы получите хорошее представление о том, как они заменяют "временный документ" ("документ без названия") на открытый документ.

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

Другие вопросы по тегам