ICloud enabled - остановить отображение открытого файла при запуске приложения?

Я только что добавил поддержку iCloud в приложение, над которым я работаю. Он отлично работает, за исключением того, что когда я открываю приложение без фокуса документа, открывается диалоговое окно открытия iCloud, и я не хочу его!

В моем делегате приложения у меня есть:

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

Что я использую, чтобы показать свое собственное окно. Однако теперь отображаются как диалоговое окно открытия iCloud, так и мое собственное диалоговое окно. Любые идеи о том, как я могу избавиться от диалога iCloud?

Default Window

Ответ 1

Я думал, что поделюсь своим решением этой проблемы, поскольку я вижу, что другие все еще ищут ответ. Это не лучшее решение, но оно делает свое дело.

  1. Подкласс NSDocumentController и добавить следующее:

+ (void) setCanOpenUntitledDocument: (BOOL) _canOpenUntitledDocument
{
    canOpenUntitledDocument = _canOpenUntitledDocument;
} // End of setCanOpenUntitledDocument:

- (void) openDocument: (id) sender
{
    // With iCloud enabled, the app keeps trying to run openDocument: on first launch (before apphasfinishedlaunching gets set.
    // This method lets us check and see if the app has finished launching or not. If we try to open a document before
    // its finished, then don't let it.
    if(!canOpenUntitledDocument)
    {
        return;
    } // End of appHasFinishedLaunching not set

    [super openDocument: sender];
} // End of openDocument:

Добавьте следующее к вашему делегату приложения:


- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    // Finished launching. Let us open untitled documents.
    [SQLProDocumentController setCanOpenUntitledDocument: true];

    ...
}

И applicationShouldHandleReopen:hasVisibleWindows: установив openDocument останова в openDocument я обнаружил, что она openDocument до applicationDidFinishLaunching, applicationShouldOpenUntitledFile или applicationShouldHandleReopen:hasVisibleWindows: get applicationShouldHandleReopen:hasVisibleWindows:, что означает, что добавление этих методов бесполезно. Опять же, это не очень хороший код, но он работает и делает свое дело.

Ответ 2

https://developer.apple.com/library/prerelease/content/releasenotes/AppKit/RN-AppKitOlderNotes/index.html

Поддержка NSDocument для iCloud

В 10.8 приложения, основанные на NSDocument, с правом на идентификацию ubiquity-container-identifiers получают новые функциональные возможности и пользовательский интерфейс для облегчения управления документами iCloud.

Когда iCloud включен и приложение запускается или повторно запускается, а окна не видны или не восстанавливаются, вместо создания нового документа Untitled NSDocumentController отображает немодальную открытую панель, показывающую библиотеку iCloud пользователя.

...

Приложения, которые не хотят использовать эти функции для любого или всех своих подклассов NSDocument, могут переопределить + [NSDocument useUbiquitousStorage] и вернуть NO. Если все приложения, объявленные подкласс NSDocument, возвращают NO из этого метода, тогда NSDocumentController никогда не покажет новую немодальную открытую панель.

Итак, если вы можете отказаться от использования функций, перечисленных в этой заметке о выпуске, return NO в +[NSDocument usesUbiquitousStorage]. Я подтвердил, что вы все равно можете открыть/сохранить файл в хранилище iCloud из обычного диалога.

Ответ 3

Помещение ниже кодов в вашем делете делегата позволяет обойти, что iCloud открывает экран "Новый документ". Протестировано для Высокой Сьерры.

-(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];
    }
}

Ответ 4

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

Эта часть верна. Я только что протестировал его.

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

  • Создайте новый класс с именем prefixAppDelegate
  • В MainMenu.xib перетащите новый объект в сторону и установите его для класса делегата класса
  • Щелкните правой кнопкой мыши Приложение и перетяните с Делегат до объекта делегирования приложения.
  • Теперь просто вставьте код выше в класс делегата приложения

Если это все еще не помогает, попробуйте выполнить запись в applicationShouldOpenUntitledFile:.

Кроме того, я рекомендую не устанавливать [mainWindowController.window makeKeyAndOrderFront:self]; в этот метод. Вы должны использовать метод метода делегата app applicationDidFinishLaunching:.

Ответ 5

Мои наблюдения и исправления: [applicationShouldOpenUntitledFile:] не будет выполнен, кроме как удалить ключ NSDocumentClass из * -info.plist. Но это вредно, если ваше приложение основано на документе, оно не откроет тип документа, который вы связали.

Мое исправление открывает мое настраиваемое окно непосредственно в методе -(void)applicationWillFinishLaunching:(NSNotification *)notification (делегат приложения)

ETDocumentWindowController *windowController =  (ETDocumentWindowController*)get your own window controller here...;
[windowController.window makeKeyAndOrderFront:nil];

Ответ 6

У меня возникла аналогичная проблема - оказалось, что в моем случае мне пришлось удалить ключ и значение NSDocumentClass из моего Info.plist в массиве CFBundleDocumentTypes. Только после этого метод applicationShouldOpenUntitledFile: вызывается и, таким образом, позволяет мне не открывать окно iCloud/Document.