Как я могу настроить NSWindowDelegate для обнаружения windowDidEnterFullScreen и подобных событий?

#swift #xcode #macos

Вопрос:

Я выяснил, что есть windowDidEnterFullScreen функция, NSWindowDelegate позволяющая определять, когда окно переходит в полноэкранный режим.

У меня есть:

 class WindowDelegate: NSWindowDelegate {
    func windowDidEnterFullScreen(_ _: Notification) {
        // Called when window will enter fullscreen
    }
}
 

Как я могу заставить приложение зарегистрировать это, чтобы функция вызывалась, когда окно переходит в полноэкранный режим?

Ответ №1:

В приложении раскадровки есть окно Window Controller внутри Main.storyboard . По умолчанию Window Controller используется NSWindowController класс. Сначала вам нужно добавить NSWindowController в свой класс, и я предлагаю переименовать его в WindowController :

 class WindowController: NSWindowController, NSWindowDelegate
 

Затем найдите Window Controller в Window Controller Scene в Main.storyboard и выберите его, затем Пользовательский класс в инспекторе, введите имя пользовательского класса ( WindowController ) в поле класс. Это подскажет приложению использовать ваш пользовательский контроллер/делегат окна вместо стандартного NSWindowController .

Пользовательский класс Инспектора

Комментарии:

1. К вашему сведению: Хотя использование вашего собственного NSWindowController подкласса обычно полезно, в данном случае это не является строго необходимым. Функция обратного вызова, в которой заинтересована операция ( windowDidEnterFullScreen ), доступна на NSWindowDelegate . Вы можете добавить новый объект NSWindowDelegate класса, соответствующего вашему классу, в свою раскадровку и связать его непосредственно с вашими окнами (они могут быть даже настоящими NSWindow s, нет необходимости в подклассе), и это должно сработать.

2. В этом случае вам даже не нужен пользовательский делегат, просто обратите внимание на уведомление.

3. @Willeke, Но какой путь чище?

4. Это зависит от того, что вам нужно, и это дело вкуса.