NSDocumentController closeAllDocumentsWithDelegate не вызывает canCloseDocumentWithDelegate моего подкласса NSPersistentDocument - PullRequest
0 голосов
/ 03 февраля 2020

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

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

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

1 Ответ

0 голосов
/ 29 марта 2020

Согласно технической поддержке Apple Developer, это известная проблема. Я наконец-то оборвал автоматическую c разметку пункта меню выхода из приложения и обработал все сам. Мне нужно было сделать информацию о функциональных возможностях сервера документа доступной извне (в этом примере состояние 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 binding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...