NSDocumentController closeAllDocumentsWithDelegate не вызывает canCloseDocumentWithDelegate моего подкласса NSPersistentDocument

Согласно документам Apple, closeAllDocumentsWithDelegate (из NSDocumentController) должен вызывать canCloseDocumentWithDelegate из NSDocument для всех открытых документов, если вы выходите из приложения.

В моем приложении на основе NSPersistentDocument мне нужно переопределить canCloseDocumentWithDelegate, чтобы предупредить пользователя, если определенные функции сервера все еще работают, когда документ закрывается. Это не имеет ничего общего с какими-либо изменениями данных. Это работает, когда пользователь закрывает один документ; Я могу представить лист с предупреждением и позволить пользователю отменить процесс закрытия.

Однако моя версия canCloseDocumentWithDelegate не вызывается при выходе из приложения. Что может быть причиной этого?


person Dirk    schedule 03.02.2020    source источник


Ответы (1)


Согласно технической поддержке разработчиков Apple, это известная проблема. Я, наконец, отключил автоматическую проводку пункта меню выхода из приложения и справляюсь со всем сам. Мне нужно было сделать информацию о функциональности сервера документа доступной извне (в этом примере состояние optionButton), и я добавил эту функцию в AppDelegate:

- (IBAction)terminateGracefully:(id)sender {
    BOOL optionOn = FALSE;
    for (Document *doc in NSApp.orderedDocuments) {
        if (doc.optionButton.state == NSControlStateValueOn) {
            optionOn = TRUE;
        }
    }

    if (optionOn) {
        NSAlert *alert = [[NSAlert alloc] init];
        [alert setMessageText:@"Checkbox in some window is on"];
        [alert setInformativeText:@"Something is going on. If you close the app now, it will stop. Close anyway?\n"];
        [alert setAlertStyle:NSAlertStyleCritical];
        [alert addButtonWithTitle:@"Don't close"];
        [alert addButtonWithTitle:@"Close anyway"];

        NSModalResponse resp = [alert runModal];

        if (resp == NSAlertSecondButtonReturn) {
            // We really want to close
            [NSApp terminate:sender];
        }

    } else {
        [NSApp terminate:sender];
    }
}

Затем я привязал пункт меню выхода приложения к terminateGracefully:

Привязка Xcode

person Dirk    schedule 29.03.2020