Почему не вызывается applicationShouldOpenUntitledFile? - PullRequest
9 голосов
/ 27 сентября 2011

Я добавил 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 ]

10 голосов
/ 27 сентября 2011

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

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

6 голосов
/ 04 октября 2012
-(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];
    }
}
1 голос
/ 20 июля 2017

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

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

1 голос
/ 17 февраля 2014

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

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

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

1 голос
/ 24 сентября 2012

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

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

...