Выполнять код до восстановления состояния (macOs)

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

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

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

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

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

Спасибо


person gotramaval    schedule 22.10.2018    source источник


Ответы (1)


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

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

@synthesize licenseDialogOpen;

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

В моем классе Document я перезаписал 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 чтобы запросить лицензионный ключ.

person Dirk    schedule 09.11.2018