Почему не вызывается 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
5 ответов
Ты бежишь, Лев. Когда вы бежали, прежде чем добавить applicationShouldOpenUntitledFile
обработчик, новый документ создан. Теперь с помощью 10.7 "Восстановление окон при выходе и повторном открытии приложений" ваше приложение восстанавливает это безымянное окно, а не создает новое, как вы предполагаете.
Закройте это окно и перезапустите приложение, и applicationShouldOpenUntitledFile
будет вызван и будет подавлять создание нового файла без названия.
-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
// Schedule "Checking whether document exists." into next UI Loop.
// Because document is not restored yet.
// So we don't know what do we have to create new one.
// Opened document can be identified here. (double click document file)
NSInvocationOperation* op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(openNewDocumentIfNeeded) object:nil];
[[NSOperationQueue mainQueue] addOperation: op];
}
-(void)openNewDocumentIfNeeded
{
NSUInteger documentCount = [[[NSDocumentController sharedDocumentController] documents]count];
// Open an untitled document what if there is no document. (restored, opened).
if(documentCount == 0){
[[NSDocumentController sharedDocumentController]openUntitledDocumentAndDisplay:YES error: nil];
}
}
Я использую Xcode 8.3.2 и компилирую для Os X 10.11, используя раскадровку для приложения на основе документов. Я заметил, что если вы установите контроллер окна в качестве начального контроллера, окно будет создано без какого-либо документа и без вызова applicationShouldOpenUntitledFile.
Я решил убрать флажок "Первоначальный контроллер" в раскадровке.
Если вы не используете Lion / 10.7 или более позднюю версию, это все еще может произойти, если у вас открыто какое-то другое окно (даже окно без документа), когда applicationShouldOpenUntitledFile
должен быть назван.
У меня есть приложение на основе документов, в котором класс AppDelegate открывает окно глобального ведения журнала как для целей отладки, так и для сообщений о состоянии пользователя. Если у меня программа отображает это окно при запуске во время работы на OS X 10.6, applicationShouldOpenUntitledFile
никогда не вызывается, даже если окна документов не отображаются. Если я выключу это окно, вызов будет сделан.
Начиная с OSX Lion, восстановление состояния приложения может повлиять на ваши пользовательские настройки для этого упражнения.
Цитируя обновление к книге Аарона Хиллегаса и Адама Пребла " Программирование какао для MacOSX":
Обратите внимание, что функции восстановления состояния Mac OS X Lion могут усложнить наблюдение за предпочтениями нового документа. Вы можете отключить восстановление состояния, отредактировав схему Run в Xcode. Откройте меню продукта и выберите "Редактировать схему". Выберите схему "Запустить RaiseMan.app", перейдите на панель "Параметры" и установите флажок "Отключить восстановление состояния".