Как Xcode устанавливает приложение на основе документов? - PullRequest
8 голосов
/ 26 июня 2011

Я изучаю Какао, и, прочитав документацию, я понимаю, что при запуске приложения происходит следующее:

  1. Создан общий экземпляр приложения.
  2. Основной файл пера ищется из списка свойств приложений, чтобы приложение знало, какой пиб загрузить.
  3. цикл запуска запущен.

Это нормально и имеет смысл для одного оконного приложения, однако меня смущает то, что делает xcode при создании основанного на документе приложения .

В этом случае есть два файла пера; первый содержит меню приложения, а второй - окно, представляющее подкласс NSDocument . когда я запускаю приложение, новое окно документа открывается автоматически.

Основываясь на моем понимании того, как работает приложение, описанное выше, я не понимаю, как мое приложение знает, как открыть окно документа после того, как перо меню было найдено из списка свойств. Насколько я вижу, не было сгенерированного кода для этого (за исключением метода windowNibName , но откуда он вызывается?)

Может кто-нибудь сказать мне, что xcode делает по-другому, чтобы приложение знало, что оно основано на документе, и поэтому ему нужно открыть окно документа?

Обновление:

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

Из чтения документов за последние пару дней я думаю Я знаю, как это работает, но я не уверен:

  1. _NSApplication_ имеет метод делегата applicationOpensUntitledFile , который вызывается делегатом приложения.
  2. NSDocumentController устанавливается в качестве делегата приложений по умолчанию, а реализация по умолчанию ищет наличие CFBundledTypeInfo , чтобы определить, является ли документ основанным на документе, и отвечает соответствующим образом. для приложения (IE YES для приложения на основе документов и NO для приложений с одним окном).
  3. В большинстве случаев при создании приложения с одним окном делегат приложения заменяется пользовательским AppController , который обычно не содержит определения для метода applicationOpenUntitledFile , как есть не подходит для типа приложения.

Надеюсь, что любой эксперт по какао сможет подтвердить, правильно ли я понимаю, или я лаю не на том дереве.

Ответы [ 3 ]

5 голосов
/ 26 июня 2011

Когда вы создаете приложение на основе документов, вы получаете несколько вещей:

  • Подкласс NSDocument
  • Новый xib-файл для этого документа, в дополнение к MainMenu.xib
  • Запись CFBundleDocumentTypes в Info.plist, которая сообщает приложению о вашем подклассе NSDocument

Когда ваше приложение открывается, совместно используемый NSDocumentController создаст новый документ без названия, используя информацию CFBundleDocumentTypes.

Для получения дополнительной информации прочитайте Шаблон проекта приложения на основе документа и остальные руководства по приложениям на основе документа.

0 голосов
/ 10 июля 2014

Нет, ваше предположение неверно, посмотрите на реализацию версии GNUstep в методе finishLaunching NSApplication:

NSDocumentController    *sdc;
sdc = [NSDocumentController sharedDocumentController];
if ([[sdc documentClassNames] count] > 0)
{
  didAutoreopen = [sdc _reopenAutosavedDocuments];
}

Таким образом, он автоматически создает экземпляр NSDocumentController.

0 голосов
/ 09 декабря 2013

Я принимаю ваше право.Если вы создаете неосновное приложение для документов, добавьте информацию о типах документов в -Info.plist и установите делегата NSApplication в main.m следующим образом

int main(int argc, const char * argv[])
{
    [[NSApplication sharedApplication] setDelegate:[NSDocumentController sharedDocumentController]];
    [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:NSApp topLevelObjects:nil];
    [NSApp run];
}

Поведение выглядит так же, какшаблон приложения по умолчанию для документов.

...