Почему не вызывается applicationShouldOpenUntitledFile?

Я добавил метод applicationShouldOpenUntitledFile к моему делегату приложения, возвращая NO, как указано в документации Apple. Тем не менее, я все еще получаю новый документ при запуске. Что случилось?

@implementation AppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog( @"This is being called" );
}

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    NSLog( @"This never is" );
    return NO;  
}

@end

person Steven Fisher    schedule 27.09.2011    source источник


Ответы (5)


Вы управляете Львом. При запуске перед добавлением обработчика applicationShouldOpenUntitledFile был создан новый документ. Теперь, с 10.7 «Восстанавливать окна при выходе и повторном открытии приложений», ваше приложение восстанавливает это окно без названия, а не создает новое, как вы предполагаете.

Закройте это окно и перезапустите приложение, и будет вызвана функция applicationShouldOpenUntitledFile, которая подавит создание нового файла без названия.

person Steven Fisher    schedule 27.09.2011
comment
Правильно - это указано в примечаниях к выпуску Lion. - person Joshua Nozzi; 27.09.2011
comment
Но не в документации для NSApplicationDelegate, которую я искал. :) NSApplicationDelegate описывает старое поведение так, как будто оно все еще применимо без какого-либо упоминания о новом поведении. Я предполагаю, что это будет исправлено в будущем SDK. - person Steven Fisher; 27.09.2011
comment
Примечания к выпуску являются документацией. Конечно, возможно, что-то еще не было обновлено в справочнике по API, но вы должны всегда читать примечания к выпуску для любых обновлений ОС. - person Joshua Nozzi; 28.09.2011
comment
У вас есть конкретное предложение по улучшению этого вопроса/ответа? Я попытался добавить ссылку на документацию Apple, но она задокументирована косвенно, а не где-либо прямо указано. - person Steven Fisher; 28.09.2011
comment
Вы имеете в виду помимо указания, где эта информация упоминается в моем первом комментарии? Нет. - person Joshua Nozzi; 28.09.2011
comment
Это явно ошибка. Потому что нет способа узнать, существует ли восстановленный документ при запуске приложения. В настоящее время NSDocumentController не содержит документа (будет восстановлен). Итак, мы не можем понять, что нам нужно, чтобы открыть безымянный документ или нет. - person jeeeyul; 04.10.2012
comment
Не внедряйте applicationShouldOpenUntitledFile; OS X должна сделать все остальное автоматически за вас. - person Steven Fisher; 04.10.2012

Я использую Xcode 8.3.2 и компилирую для Os X 10.11, используя раскадровку для приложения на основе документов. Я заметил, что если вы установите контроллер окна в качестве начального контроллера, окно будет создано без какого-либо документа и без вызова applicationShouldOpenUntitledFile.

Я решил снять флажок «исходный контроллер» в раскадровке.

person Sgorbyo    schedule 20.07.2017

Если вы не используете Lion / 10.7 или более позднюю версию, это все равно может произойти, если у вас открыто какое-то другое окно (даже не окно документа), когда applicationShouldOpenUntitledFileдолжно быть вызвано.

У меня есть приложение на основе документов, в котором класс AppDelegate открывает окно глобального ведения журнала как для целей отладки, так и для сообщений о состоянии пользователя. Если у меня программа отображает это окно при запуске во время работы в OS X 10.6, applicationShouldOpenUntitledFile никогда не вызывается, даже если окна документов не отображаются. Если я выключу это окно, вызов будет сделан.

person Adam Wilt    schedule 23.09.2012

Начиная с OSX Lion, восстановление состояния приложения может помешать вашим пользовательским настройкам для этого упражнения.

Ссылаясь на обновление книги Аарона Хиллегасса и Адама Пребла Cocoa Programming for MacOSX:

Обратите внимание, что функции восстановления состояния Mac OS X Lion могут затруднить соблюдение нового предпочтения документа. Вы можете отключить восстановление состояния, отредактировав схему запуска в Xcode. Откройте меню продукта и выберите «Редактировать схему». Выберите схему «Выполнить RaiseMan.app», перейдите на панель «Параметры» и установите флажок «Отключить восстановление состояния».

person Fnord23    schedule 17.02.2014

person    schedule
comment
Это также полезно для приложений, не поддерживающих работу с документами, которым требуется такое же базовое поведение. Спасибо за этот пост! - person Maury Markowitz; 09.08.2015