Какао /Objective-C - дочернее окно с вводом текста без того, чтобы главное окно стало неактивным
Мне нужно создать окно, которое будет зависать над моим главным окном в приложении какао. Я хочу, чтобы это главное окно позволяло пользователю вводить текст в поле ввода. Все хорошо, пока текстовое поле ввода не приобретет фокус. Главное окно становится "деактивированным". Это окно не имеет границ и имеет слегка нестандартную форму - я думаю, что оно больше похоже на карту наведения, чем на что-либо еще.
По сути, мне бы хотелось, чтобы эта штука работала почти так же, как Spotlight (Apple + Space) - вы можете вводить текст, но это такая вспомогательная операция, что в контексте большего UX вам не нужен резкий шум эффект затенения основного окна (становление неактивным). Вы заметите, что, когда у вас открыто какое-то приложение, и в фокусе прожектор не заставит окно этого приложения стать неактивным.
Эта проблема возникает из-за того, что для ввода текста, по-видимому, ТРЕБУЕТСЯ, чтобы дочернее окно стало ключевым окном (оно не позволит вам поместить курсор в поле ввода текста). Когда он становится ключевым, главное окно становится неактивным.
Пока что я пробовал:
- Создание подкласса NSWindow для моего основного приложения и переопределение isKeyWindow таким образом, что оно теряет ключ только тогда, когда приложение перестает быть в фокусе пользователя (в отличие от окна). Это имело непреднамеренный эффект столкновения с состоянием ключа дочернего окна и очень странного влияния на ввод с клавиатуры (некоторые клавиши не фиксируются, например, удаление)
- Создание представления вместо окна. Не работает из-за этой проблемы - вы не можете рисовать через Webkit WebView в эти дни.
У кого-нибудь есть мастера Какао /OSX? Я стал немного одержим этим. Зуд, который я не могу поцарапать.
Изменить: также попытался переопределить следующее в дочернем окне. При нажатии окно делает главное окно приложения неактивным.
- (BOOL)canBecomeKeyWindow {
return YES;
}
- (BOOL)canBecomeMainWindow {
return NO;
}
Редактировать 2: После недолгого общения с NSMenu, я отказался от этого подхода. Кажется, я что-то нашел, однако. В NSPanel есть маска стиля окна, которая называется:
NSNonactivatingPanelMask
The panel can receive keyboard input without activating the owning application.
Valid only for an instance of NSPanel or its subclasses; not valid for a window.
Попробуй это сейчас...
Редактировать 3: NSNonactivatingPanelMask не добился цели. Нет идей
2 ответа
То, что вы хотите, это окно, которое может стать ключевым, но не может стать главным окном. Вы могли бы реализовать такой класс самостоятельно, но это в основном то, для чего предназначен NSPanel, поэтому вы можете попробовать это в первую очередь.
Я думаю, что это может помочь вам: [self.childWindow makeKeyAndOrderFront:self];