Выполнить код до восстановления состояния (macOs) - PullRequest
0 голосов
/ 22 октября 2018

Я пишу основанное на документе приложение для Mac в Swift 4, которое, в соответствии с потребностями моего клиента, должно отображать окно лицензирования, в котором пользователь предоставит свой лицензионный ключ.

Я показываю это окно методом applicationWillFinishLaunching().Пока это окно активно, методы восстановления состояния запускаются в фоновом режиме и загружают предыдущие nsdocuments или создают пустые, если их не было.Я хочу избежать этого, я хочу иметь возможность выбирать, когда восстановление и ведет себя как приложение на основе документов.

Я пытался перехватить запуск приложения в методе appDelegate applicationShouldOpenUntitledFile(_ sender: NSApplication), но яне удалосьЗатем я прочитал здесь , что этот метод не вызывается, если активно восстановление состояния приложения.Чтобы подтвердить это, я деактивировал восстановление, а затем последние документы или пустые документы больше не загружались / создавались, как ожидалось.Отлично!

Но тогда я теряю приятную функциональность восстановления.

Мне интересно, есть ли лучший способ сделать это: отображение экрана лицензирования в приложении на основе документов, остановкаметоды восстановления и вызов их вручную после лицензирования приложения.

Спасибо

1 Ответ

0 голосов
/ 09 ноября 2018

Это Цель C, но именно так я и сделал, чтобы показать диалоговое окно, в котором пользователь должен принять некоторые условия лицензии:

В моем AppDelegate я получил свойство licenseDialogOpen, которое установленов false при запуске приложения.

@synthesize licenseDialogOpen;

- (instancetype)init {
    self = [super init];
    if (self) {
        self.licenseDialogOpen = FALSE;
    }
    return self;
}

В своем классе документов я переписал windowControllerDidLoadNib

- (void)windowControllerDidLoadNib:(NSWindowController *)windowController {
    [super windowControllerDidLoadNib:windowController];

    AppDelegate *appDelegate = [NSApp delegate];

    if (!appDelegate.licenseDialogOpen) {
        NSAlert *alert = [[NSAlert alloc] init];
        [alert setMessageText:NSLocalizedString(@"License conditions and disclaimer:", nil)];
        [alert setInformativeText:NSLocalizedString(@"License bla bla disclaimer bla bla bla", nil)];
        [alert setAlertStyle:NSAlertStyleWarning];
        [alert addButtonWithTitle:NSLocalizedString(@"Accept", nil)];
        [alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)];

        [alert.window makeFirstResponder:[[alert buttons] firstObject]];

        appDelegate.licenseDialogOpen = TRUE;
        NSModalResponse answer = [alert runModal];
        if (answer != NSAlertFirstButtonReturn) {
            for (NSWindow *window in [NSApplication sharedApplication].windows) {
                [window close];
            }
            [NSApp terminate:self];
        }
    }
}

Таким образом, первое открытое окно документа показывает модальное диалоговое окно и выходит из приложения.когда пользователь не принимает.

Вы можете добавить NSTextField к NSAlert , чтобы запросить лицензионный ключ.

...