Сделать NSView в NSPanel первым респондентом без ключевого статуса окна - PullRequest
5 голосов
/ 07 февраля 2011

Можно ли присвоить NSView внутри статуса первого респондента NSPanel, не задавая статус окна ключа NSPanel (сделав основной ключ отказа окна главного приложения)?

Спасибо.

1 Ответ

8 голосов
/ 07 февраля 2011

Ну, в конце концов я понял это, но потребовалось много исследований, поэтому я опубликую подробности здесь на случай, если кто-то столкнется с той же проблемой. Прежде всего, несколько основ:

  1. Невозможно, чтобы 2 окна были одновременно ключами
  2. Можно подделать окно, думая, что оно является ключом, переопределив -isKeyWindow, но это не даст представлениям, содержащимся в статусе первого респондента окна.

Мой сценарий:

Я добавил дочернее окно, содержащее NSTableView, в главное окно моего приложения (причина неактуальна). Дочернее окно было NSPanel с NSBorderlessWindowMask. Я хотел дать NSTableView статус первого респондента, не делая панель ключевым окном, потому что оно убирало фокус из главного окна (и весь смысл иллюзии дочернего окна состоял в том, чтобы дочернее окно выглядело, как будто оно было частью главное окно).

Первым делом я попытался обмануть представление таблицы, думая, что оно находится внутри ключевого окна, переопределив isKeyWindow для возврата YES. Это делало представление таблицы так, как будто оно было первым респондентом, но все равно не давало ему статус первого респондента.

Решение:

Таким образом, по умолчанию NSBorderlessWindowMask не позволит окну стать ключевым. Чтобы табличное представление отвечало первым, окно должно быть ключевым, поэтому я переопределил canBecomeKeyWindow в подклассе окна без полей, чтобы вернуть YES. Это, конечно, убрало статус ключа из главного окна, что я хотел избежать. Чтобы это исправить, я вложил в мое главное окно и переопределил следующие методы:

- (BOOL)isMainWindow
{
    return YES;
}

- (BOOL)isKeyWindow
{
    return ([NSApp isActive]) ? YES : [super isKeyWindow];
}

Этот подкласс проверяет, активно ли приложение, и если оно есть, оно всегда возвращает YES, так что независимо от того, какое окно активно в вашем приложении, главное окно всегда будет вести себя так, как если бы оно все еще было ключевым. Этот вид создает иллюзию того, что вы можете иметь несколько окон одновременно, и позволяет вам переключать статус ключевого окна в другое окно, не теряя его в главном окне. Надеюсь, это поможет!

...