Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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

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