Приложение OS X Menubar: как вывести окно на передний план

Я разрабатываю приложение только для строки меню для OS X и изо всех сил пытаюсь заставить окно настроек отображаться перед другими приложениями.

Настройка приложения

«Приложение только для Menubar» означает:

  • Я удалил «Начальный контроллер» из NSWindowController в основном файле раскадровки. Главное окно раскадровки не используется в моем приложении
  • Я добавил NSMenu в «Сцену приложения» в основной раскадровке. Это станет моим меню в строке меню
  • Я установил LSUIElement на YES, чтобы скрыть значок док-станции
  • Я установил LSBackgroundOnly на NO (см. NSWindow makeKeyAndOrderFront заставляет окно отображаться , но не Key или Front)

Когда приложение запускается, я создаю NSStatusItem и добавляю NSMenu из раскадровки в качестве его меню. Все это работает нормально - приложение запускается, не показывает ни окна, ни значка док-станции, а только элемент строки меню, содержащий меню из раскадровки.

Окно настроек

Теперь я хотел добавить окно настроек, которое отображается при нажатии на запись в строке меню. Поэтому я:

  • Создал новый .xib-файл и добавил к нему NSWindow
  • Создал кастом NSWindowController, который связывает розетки и действия
  • Создал пользовательский NSWindowController, используя initWithNibNamed: при запуске приложения.

Когда щелкают по пункту «Настройки» в меню, я пытаюсь вывести окно настроек на передний план, используя:

[self.settingsWindowController.window center];
[self.settingsWindowController.window showWindow:self];
[self.settingsWindowController.window makeKeyAndOrderFront:NSApp];

Окно отображается, но не выводится на передний план, а скорее скрыто за другими приложениями.

Есть идеи, как это решить? Спасибо!


person BlackWolf    schedule 29.03.2015    source источник


Ответы (2)


Вам необходимо позвонить:

[NSApp activateIgnoringOtherApps:YES];

(Это один из тех редких случаев, когда правильно передать YES этому методу.)

Для Swift вы можете использовать

NSApp.activate(ignoringOtherApps: true)
person Ken Thomases    schedule 29.03.2015
comment
Конечно! Вы тот мужчина, спасибо, это абсолютно сработало. - person BlackWolf; 29.03.2015
comment
В приложении, основанном на документе, с такой точной настройкой, как вы можете заставить приложение отображать свое меню? Окно отображается правильно, но без меню. При переключении приложений вперед и назад меню отображается правильно. - person Oscar Swanros; 05.11.2016

Я знаю, что вы просите obj-c и уже получили ответ, но на всякий случай, если кто-то ищет в Google реализацию Swift 4.

В вашем классе, который расширяет NSWindowController, определите функцию:

func bringToFront() {
  self.window?.center()
  self.window?.makeKeyAndOrderFront(nil)
  NSApp.activate(ignoringOtherApps: true)
}

Затем всякий раз, когда вы захотите поднять это, вызывайте приноситьToFront ().

person Abushawish    schedule 15.06.2018
comment
Спасибо! Просто добавление NSApp.activate(ignoringOtherApps: true) в мою функцию подготовки к переходу сработало для меня. Вызов метода giveToFront () из windowDidLoad не сделал этого. - person Josh; 16.01.2019