Cocoa/Objective-C - Дочернее окно с вводом текста без главного окна, становящегося неактивным

У меня есть потребность породить окно, которое будет колебаться чуть выше моего главного окна в приложении какао. Я хочу, чтобы это главное окно позволило пользователю вводить некоторый текст в поле ввода. Все хорошо, пока поле ввода текста на самом деле не получает фокус. Главное окно становится "деактивированным". Это окно является безграничным и является немного пользовательской формой - больше как карта при наведении курсора, чем что-либо еще, я предполагаю.

В основном я хотел бы эту вещь работать почти точно как Центр внимания (Apple + Пространство) - можно ввести текст, но это - такая вспомогательная операция, что в контексте большего UX, Вы не хотите резкого эффекта отображающегося серым главного окна (становление неактивным). Вы заметите, когда у Вас будет некоторое приложение, открытое и в фокусе, центр внимания не заставит окно того приложения становиться неактивным.

Эта проблема возникает, потому что ввод текста, кажется, ТРЕБУЕТ, чтобы дочернее окно стало ключевым окном (это не позволит Вам установить курсор в поле ввода текста). Когда это становится ключевым, главное окно становится неактивным.

До сих пор я попробовал:

  • Разделение на подклассы NSWindow для моего главного приложения и переопределение isKeyWindow таким образом, что это только теряет ключ, когда приложение больше не является пользователями, фокусируются (в противоположность окну). Это имело непреднамеренный эффект столкновения с ключевым состоянием дочернего окна, и имение очень странных эффектов на ввод с клавиатуры (некоторые ключи не получены, как удаляют),
  • Создание представления вместо окна. Не работает из-за этой проблемы - Вы не можете дистиллировать веб-представление WebKit в эти дни.

У кого-либо мастера Cocoa/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 не добивался цели. Никакие идеи.

6
задан Community 23 May 2017 в 11:53
поделиться

1 ответ

Вам нужно окно, которое может стать ключевым окном, но не может стать главным окном. Вы могли бы реализовать такой класс самостоятельно, но для этого, в основном, и существует NSPanel, так что попробуйте сначала его.

1
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: