Создание окна в приложении строки состояния для macOS

Предупреждение: здесь начинающий разработчик macOS.

У меня есть приложение для панели меню (без док-станции). Большая часть функций приложения находится в меню (а реализация находится в AppDelegate), но мне нужно отдельное окно, которое открывается, когда я нажимаю один из пунктов меню.

Я хочу использовать SwiftUI, Swift 5, Xcode 11.3.

Я не нашел подходящего способа сделать это. Какие файлы и подобное нужно создать? Как открыть это окно программно?

@objc func openPreferences() {
  // open a new window here...
}

person Dragos Strugar    schedule 21.02.2020    source источник


Ответы (1)


Вы должны создать окно программно. Я прикрепил образец кода одного из своих приложений:

private var windowController: NSWindowController?

fileprivate func createWindow()
{
    let storyboard = NSStoryboard(name: "Main", bundle: nil)

    self.windowController = storyboard.instantiateInitialController() as? NSWindowController

    // This is example code to show how to customize the hosted view controller. You can pass additional arguments here (may an important global variables that is declared in the AppDelegate).
    if let contentController = windowController?.contentViewController as? MyWindowViewController
    {
        // Do some assignments here
        // contentController.variable = ....
        // self.windowViewController = contentController // Maybe save for later use.
    }
}

@objc fileprivate func open()
{
    if self.windowViewController == nil
    {
        self.createWindow()
    }

    self.windowController?.showWindow(self)

    NSApp.activate(ignoringOtherApps: true) // Bring window to front.
}

Я связал функцию open () с вызовом кнопки (отсюда и ключевое слово @objc). Я думаю, что вы уже это сделали, поэтому моя функция open () будет вашей openPreferences функцией.

person inexcitus    schedule 21.02.2020
comment
Спасибо, вот что мне было нужно. Однако несколько вопросов: 1) Не могли бы вы предоставить очень простую MyWindowViewController реализацию? А что такое self.windowController ? - person Dragos Strugar; 21.02.2020
comment
windowController - это глобальная переменная AppDelegate. Вы используете эту переменную для сохранения экземпляра. NSWindowViewController - это экземпляр типа NSViewController. Здесь реализована логика диалогового окна ваших предпочтений (логика элементов управления, например, значения параметров для флажков и т. Д.). MyWindowViewController может быть здесь необязательным, вам нужен этот экземпляр в AppDelegate только в том случае, если вы хотите передать некоторые данные (чего вы, вероятно, не будете делать в простом диалоговом окне настроек). - person inexcitus; 21.02.2020
comment
Что такое self.windowViewController? self.windowViewController?.view.window?.windowController то же самое, что self.windowController? - person Willeke; 21.02.2020