Ну, в конце концов я понял это, но потребовалось много исследований, поэтому я опубликую подробности здесь на случай, если кто-то столкнется с той же проблемой. Прежде всего, несколько основ:
- Невозможно, чтобы 2 окна были одновременно ключами
- Можно подделать окно, думая, что оно является ключом, переопределив
-isKeyWindow
, но это не даст представлениям, содержащимся в статусе первого респондента окна.
Мой сценарий:
Я добавил дочернее окно, содержащее NSTableView
, в главное окно моего приложения (причина неактуальна). Дочернее окно было NSPanel
с NSBorderlessWindowMask
. Я хотел дать NSTableView
статус первого респондента, не делая панель ключевым окном, потому что оно убирало фокус из главного окна (и весь смысл иллюзии дочернего окна состоял в том, чтобы дочернее окно выглядело, как будто оно было частью главное окно).
Первым делом я попытался обмануть представление таблицы, думая, что оно находится внутри ключевого окна, переопределив isKeyWindow
для возврата YES
. Это делало представление таблицы так, как будто оно было первым респондентом, но все равно не давало ему статус первого респондента.
Решение:
Таким образом, по умолчанию NSBorderlessWindowMask не позволит окну стать ключевым. Чтобы табличное представление отвечало первым, окно должно быть ключевым, поэтому я переопределил canBecomeKeyWindow
в подклассе окна без полей, чтобы вернуть YES
. Это, конечно, убрало статус ключа из главного окна, что я хотел избежать. Чтобы это исправить, я вложил в мое главное окно и переопределил следующие методы:
- (BOOL)isMainWindow
{
return YES;
}
- (BOOL)isKeyWindow
{
return ([NSApp isActive]) ? YES : [super isKeyWindow];
}
Этот подкласс проверяет, активно ли приложение, и если оно есть, оно всегда возвращает YES
, так что независимо от того, какое окно активно в вашем приложении, главное окно всегда будет вести себя так, как если бы оно все еще было ключевым. Этот вид создает иллюзию того, что вы можете иметь несколько окон одновременно, и позволяет вам переключать статус ключевого окна в другое окно, не теряя его в главном окне. Надеюсь, это поможет!