Почему не вызывается 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", перейдите на панель "Параметры" и установите флажок "Отключить восстановление состояния".

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