Какао Xcode: открыть контроллер окна из AppDelegate программно с помощью Swift 4 для Mac? - PullRequest
0 голосов
/ 28 августа 2018

Я делаю простое приложение в строке меню, которое состоит из 2 пунктов - Предпочтения & Выход

Я хочу открыть новое окно, когда нажимаю Предпочтения

В настоящее время у меня есть

func applicationDidFinishLaunching(_ aNotification: Notification) {
        constructMenu()
    }

func constructMenu() {
        let menu = NSMenu()

        menu.addItem(NSMenuItem(
                       title: "Preferences...", 
                       action: #selector(AppDelegate.preferencesWindow(_:)), 
                       keyEquivalent: "P"))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(
                       title: "Quit", 
                       action: #selector(NSApplication.terminate(_:)), 
                       keyEquivalent: "q"))

        statusItem.menu = menu
    }

@objc func preferencesWindow(_ sender: Any) {
        print("open preference window here")
        if let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil) {
            let controller = storyboard.instantiateControllerWithIdentifier("preferencesWindow")
 as NSViewController

            if let window = NSApplication.shared.mainWindow {
                window.contentViewController = controller // just swap
            }
        }
    }

Но в этой строке выдается ошибка

if let storyboard = NSStoryboard (имя: NSStoryboard.Name (rawValue: "Main"), комплект: nil) {

с указанием

Инициализатор для условного связывания должен иметь необязательный тип, а не 'NSStoryboard'

Когда я нажимаю Настройки оператор print регистрируется, но я не знаю, как программно открыть окно.

Я только что перетащил Контроллер окон из Библиотека объектов и получил Идентификатор StoryBoard Значение ПредпочтенияWindow

Я также попробовал следующее из-за вышеуказанной ошибки

@objc func preferencesWindow(_ sender: Any) {
        print("open preference window here")
        let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
        let controller = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "preferencesWindow")) as! NSViewController

        if let window = NSApplication.shared.mainWindow {
            window.contentViewController = controller // just swap
        }
    }

но он только регистрирует и никогда не открывает окно. Что мне делать?

1 Ответ

0 голосов
/ 28 августа 2018

Я быстро нахожу ответы, когда выкладываю вопрос на SO. Вот что сработало для меня

@objc func preferencesWindow(_ sender: Any) {
        var myWindow: NSWindow? = nil
        let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"),bundle: nil)
        let controller = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "preferencesWindow")) as! NSViewController
        myWindow = NSWindow(contentViewController: controller)
        NSApp.activate(ignoringOtherApps: true)
        myWindow?.makeKeyAndOrderFront(self)
        let vc = NSWindowController(window: myWindow)
        vc.showWindow(self)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...