Синхронное отображение немодального шаблона - PullRequest
2 голосов
/ 20 февраля 2012

Я пишу приложение Какао, используя архитектуру документа. Всякий раз, когда в этом приложении создается документ без названия, пользователю должно быть показано окно, в котором он может выбрать шаблон и запросить другую информацию. Только одно из этих окон должно отображаться одновременно, и желательно, чтобы было возможно взаимодействовать с остальной частью приложения, пока выбирает шаблон. (Вот как ведет себя Страницы.)

Я получил большую часть этой работы, переопределив -[NSDocumentController openUntitledDocumentAndDisplay:error:]:

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument 
                               error:(NSError *__autoreleasing *)outError {
    TsDocument * doc = [self makeUntitledDocumentOfType:self.defaultType 
                                                  error:outError];
    if(!doc) {
        return nil;
    }

    TsNewWindowController * newController = [TsNewWindowController new];
    newController.document = doc;

    if([NSApp runModalForWindow:newController.window] == NSRunAbortedResponse) {
        if(outError) {
            *outError = [NSError errorWithDomain:NSCocoaErrorDomain 
                                            code:NSUserCancelledError 
                                       userInfo:nil];
        }
        return nil;
    }

    [self addDocument:doc];

    if(displayDocument) {
        [doc makeWindowControllers];
        [doc showWindows];
    }

    return doc;
}

Однако, как вы можете видеть, окно отображается модально, блокируя доступ к остальной части приложения. Есть ли простой способ добиться того, чего я хочу, не делая модальный инструмент выбора шаблонов?


Чтобы объяснить пару вещей более четко:

  1. Конечно, я знаю, что -runModalForWindow: будет запускать окно модально - оно прямо в названии! Я ищу другой способ отображения окна, которое по-прежнему будет блокировать -openUntitledDocumentAndDisplay:error:, или для которого вообще не требуется блокировать метод.

  2. Я не верю, что могу просто создать документ, показать окно newController и вызвать makeWindowControllers и showWindows документа позже, потому что, если приложение выйдет, Restore не будет отображаться Выбор шаблона - показывает обычный интерфейс редактирования.

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Вам нужно создать и использовать NSWindowController, но это нужно сделать до вызова openUntitledDocument…::.

В неизданном Adium Xtras Creator я подключился к нескольким пунктам:

  • В делегате приложения в applicationOpenUntitledFile: я показываю окно выбора шаблона и возвращаю YES.
  • В контроллере документов в removeDocument: я передаю сообщение на super, затем проверяю, есть ли еще открытые документы. Если нет, я показываю окно выбора шаблона.
  • В контроллере документов в addDocument: я скрываю окно выбора шаблона, затем перехожу к super.

Таким образом:

  • Если пользователь пытается создать новый документ (не определенного типа) каким-либо образом, вместо него будет показан шаблон выбора.
  • Если пользователь каким-либо образом создает новый документ (явного типа), выбор шаблона будет скрыт. (В приложении, в котором я делал это, пункт меню «Новый» был настроен как подменю, содержащее определенные типы.)
  • Если пользователь каким-либо образом открывает какой-либо документ, выбор шаблона будет скрыт.
  • Если пользователь закрывает последний открытый документ, будет показан шаблон выбора.
  • Если пользователь или другое приложение пытается открыть приложение каким-либо образом, будет показан выбор шаблона.
1 голос
/ 20 февраля 2012

Вы звоните runModalForWindow:, поэтому, конечно, он запускает окно как модальное окно.

Почему бы просто не показать окно вместо этого?Используйте NSWindowController и вызовите showWindow:, чтобы отобразить окно шаблона.В вашем контроллере окна реализуйте действия, которые реагируют на выбор пользователя, а затем создайте соответствующий документ (или отмените его).

Я не думаю, что вам действительно нужно создавать документ в openUntitledDocumentAndDisplay:error:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...