Держите NSWindow переднее
Я открываю NSWindow из моего основного NSWindow.
DropHereWindowController *dropHereWindowController = [[DropHereWindowController alloc] initWithWindowNibName:@"DropHereWindow"];
[dropHereWindowController showWindow:nil];
Я хочу, чтобы это окно оставалось поверх моего главного окна при перетаскивании файла из искателя в этот "DropHereWindow". Однако при открытии искателя (больше не имея фокуса) мой "DropHereWindow" выходит за мое главное окно.
Я попробовал orderFront, makeKey, makeKeyAndFront, но ничего не помогло.
Что я могу сделать с этим?
Ответы
Ответ 1
Метод:
- (void)setLevel:(NSInteger)windowLevel
Подкласс NSWindow:
[self setLevel: NSStatusWindowLevel];
Или просто используйте:
[window setLevel: NSStatusWindowLevel];
Доступные уровни:
- NSNormalWindowLevel
- NSFloatingWindowLevel
- NSSubmenuWindowLevel
- NSTornOffMenuWindowLevel
- NSModalPanelWindowLevel
- NSMainMenuWindowLevel
- NSStatusWindowLevel
- NSPopUpMenuWindowLevel
- NSScreenSaverWindowLevel
- kCGDesktopWindowLevel
Ответ 2
Вы говорите:
Я попробовал orderFront, makeKey, makeKeyAndFront, но ничего не помогло.
И затем:
Метод:
- (void)setLevel:(NSInteger)windowLevel
Это не работает, окно по-прежнему остается за моим основным окном, когда вы нажимаете на значок искателя.
Затем вы делаете что-то неправильно.
Во-первых, окно не должно автоматически заходить в другое окно. Либо вы (или пользователь) заказываете главное окно, либо заказываете другое окно. Я предполагаю, что вы не делаете последнего.
Для другого, orderFront:
, makeKeyAndOrderFront:
и setLevel:
работают. В частности, setLevel:
помещает окно на другую плоскость, поэтому оно всегда будет перед (или позади, в зависимости от выбранного уровня) окна с уровнем по умолчанию, независимо от того, что вы делаете.
Я бы предположил, что вы не подключили или случайно отключили выход window
к окну, что означало бы, что вы отправляете сообщения orderFront:
/setLevel:
на nil
, что делает ничего. Убедитесь, что ваша розетка заполнена в том месте, где вы отправляете сообщение orderFront:
или setLevel:
, путем регистрации окна на консоли. Если в нем указано "(null)" или "0x0" (в зависимости от того, как вы его регистрируете), тогда ваша розетка удерживает nil
; убедитесь, что он подключен в наконечнике и что вы уже загрузили nib/созданный оконный контроллер.
Все, что сказал, я не согласен с тем, что setLevel:
является правильным решением. Если вы просто хотите, чтобы одно окно оставалось перед конкретным другим окном, а не помещало его на другую плоскость, сделать дочернее окно.
Ответ 3
Это работало для меня, надеюсь, что это будет полезно
[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];
Ответ 4
Использование CGWindowLevelKey
kCGMaximumWindowLevelKey
также работает.
[window setLevel:CGWindowLevelForKey(kCGMaximumWindowLevelKey)];
CGWindowLevelKey Reference
Ответ 5
Swift 4.0, Xcode 9.0
Вы можете установить свойство level
вашего NSWindow
на floating
. Например, если вы подклассифицируете NSWindow
, вы можете установить его в инициализации переопределения.
self.level = .floating
Вы также можете получить NSWindow
со своего NSWindowController
на self.window?
.
Существуют разные уровни:
NSNormalWindowLevel
Уровень по умолчанию для объектов NSWindow.
NSFloatingWindowLevel
Полезно для плавающих палитр.
NSSubmenuWindowLevel
Зарезервировано для подменю. Синоним NSTornOffMenuWindowLevel, который является предпочтительным.
NSTornOffMenuWindowLevel
Уровень для отрывного меню. Синоним NSSubmenuWindowLevel.
NSModalPanelWindowLevel
Уровень для модальной панели.
NSMainMenuWindowLevel
Зарезервировано для главного меню приложений.
NSStatusWindowLevel
Уровень для окна состояния.
NSPopUpMenuWindowLevel
Уровень для всплывающего меню.
NSScreenSaverWindowLevel
Уровень экранной заставки.