Держите NSWindow перед - PullRequest
       10

Держите NSWindow перед

15 голосов
/ 19 марта 2011

Я открываю NSWindow из моего основного NSWindow.

DropHereWindowController *dropHereWindowController = [[DropHereWindowController alloc] initWithWindowNibName:@"DropHereWindow"];
[dropHereWindowController showWindow:nil];

Я хочу, чтобы это окно оставалось поверх моего главного окна при перетаскивании файла из искателя в это «DropHereWindow».Однако при открытии искателя (больше не имеющего фокуса) мое «DropHereWindow» идет за моим главным окном.

Я пробовал orderFront, makeKey, makeKeyAndFront, но ничего не помогло.Что я могу с этим поделать?

Ответы [ 6 ]

20 голосов
/ 19 марта 2011

Метод:

- (void)setLevel:(NSInteger)windowLevel

Подкласс NSWindow:

[self setLevel: NSStatusWindowLevel];

Или просто используйте:

[window setLevel: NSStatusWindowLevel];

Доступные уровни:

  • NSNormalWindowLevel
  • NSFloatingWindowLevel
  • NSSubmenuWindowLevel
  • NSTornOffMenuWindowLevel
  • NSModalPanelWindow * Window
  • NSPopUpMenuWindowLevel
  • NSScreenSaverWindowLevel
  • kCGDesktopWindowLevel
10 голосов
/ 20 марта 2011

Вы говорите:

Я пробовал orderFront, makeKey, makeKeyAndFront, но ничего не помогло.

А потом:

Метод:

- (void)setLevel:(NSInteger)windowLevel

Это не работает, окно все еще идет за моим главным окном при нажатии на значок поиска.

Тогда вы делаете что-то не так.

Во-первых, окно в любом случае не должно автоматически переходить за другое окно. Либо вы (или пользователь) заказываете главное окно спереди, либо вы заказываете другое окно назад. Я предполагаю, что вы не делаете последнее.

Для другого orderFront:, makeKeyAndOrderFront: и setLevel: работают . В частности, setLevel: помещает окно на всю другую плоскость , поэтому всегда будет находиться перед (или позади, в зависимости от выбранного вами уровня) окнами по умолчанию уровень, независимо от того, что вы делаете.

Я полагаю, что вы не подключили или случайно отключили свой window выход к окну, что означает, что вы отправляете свои сообщения orderFront: / setLevel: на nil, что делает ничего такого. Убедитесь, что ваша розетка заполнена в том месте, куда вы отправляете сообщение orderFront: или setLevel:, войдя в окно на консоли. Если он говорит «(ноль)» или «0x0» (в зависимости от того, как вы его регистрируете), то ваша розетка содержит nil; убедитесь, что он подключен к пиру, и что вы уже загрузили пиб / создали экземпляр оконного контроллера.

Все, что сказал, я не согласен с тем, что setLevel: является правильным решением. Если вы просто хотите, чтобы одно окно оставалось перед другим конкретным окном, а не помещалось в другую плоскость, сделайте его дочерним окном .

5 голосов
/ 17 февраля 2018

Swift 4.0, Xcode 9.0

Вы можете установить свойство level вашего NSWindow на floating. Например, если вы создаете подкласс NSWindow, вы можете установить его в переопределенном init.

self.level = .floating

Вы также можете получить NSWindow от вашего NSWindowController по self.window?.

Существуют разные уровни:

NSNormalWindowLevel

Уровень по умолчанию для объектов NSWindow.

NSFloatingWindowLevel

Полезно для плавающих палитр.

NSSubmenuWindowLevel

Зарезервировано для подменю. Синоним NSTornOffMenuWindowLevel, который является предпочтительным.

NSTornOffMenuWindowLevel

Уровень для оторванного меню. Синоним NSSubmenuWindowLevel.

NSModalPanelWindowLevel

Уровень для модальной панели.

NSMainMenuWindowLevel

Зарезервировано для главного меню приложения.

NSStatusWindowLevel

Уровень для окна состояния.

NSPopUpMenuWindowLevel

Уровень всплывающего меню.

NSScreenSaverWindowLevel

Уровень заставки.

2 голосов
/ 04 декабря 2014

Это сработало для меня, надеюсь, это может быть полезным

[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];
0 голосов
/ 29 июня 2018

NSStatusWindowLevel работает, просто используйте его после небольшой задержки после запуска приложения (или после создания окна).

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
{
    self.view.window.level = NSStatusWindowLevel;
});
0 голосов
/ 24 мая 2016

Использование CGWindowLevelKey kCGMaximumWindowLevelKey также работает.

[window setLevel:CGWindowLevelForKey(kCGMaximumWindowLevelKey)];

CGWindowLevelKey Ссылка

...