NSApp: скрывать главное окно, пока не загрузится нужный ViewController - PullRequest
0 голосов
/ 22 марта 2020

У меня есть приложение MacOS, которое является зарегистрированным пользовательским обработчиком URL. Я пытаюсь, чтобы он показывал спецификацию c NSViewController, если приложение запускается через обработчик URL-адреса или обычные window и ViewController, если параметры не используются.

В моем AppDelegate.swift У меня есть это:

   func application(_ application: NSApplication, open urls: [URL]) {
        AppDelegate.externalCaller = true;

        NSApp.hide(self)
        let url: URL = urls[0];

        // Process the URL.
        let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true);
        let method = components?.host;

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            if (method == "DO_STH") {
                // do something with no window
                NSApplication.shared.windows.last?.close();
            } else if (method == "DO_STH_2") {
                // do something with no window
                NSApplication.shared.windows.last?.close();
            } else if (method == "PROCESS_STUFF") {
                        // Show window
                        DispatchQueue.main.async {
                            let mainStoryboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil);
                            let restoringViewController = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("restoringData")) as! RestoringViewController;

                            if let window = NSApp.mainWindow {
                                window.contentViewController = restoringViewController;
                            }
                            NSApp.activate(ignoringOtherApps: true);
                            AppDelegate.restoreData();
                        }
                    }
            }
        }
    }

Проблема в том, что к моменту запуска NSApp.hide(self) уже есть окно, видимое со стандартным viewController, создающее некоторый эффект мерцания.

Что такое лучший способ заставить приложение запускаться без видимого окна по умолчанию и показывать окно, только если оно не было запущено с каким-либо параметром URL, а затем по требованию, если существует указанный параметр c URL?

1 Ответ

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

Снятие отметки «Начальный контроллер» и добавление этого в AppDelegate решило мою проблему

    func applicationDidFinishLaunching(_ notification: Notification) {
        if (!AppDelegate.externalCaller) {
            showWindow();
        }
    }

    func showWindow() {
        let mainStoryboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil);
        let windowController = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("MainWindowController")) as! NSWindowController;
        windowController.showWindow(self);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...