2016-12-07 1 views
0

В моем приложении Cocoa у меня есть окно, содержащее NSTextField (как есть) и NSScrollView (подклассы). У меня есть NSViewController, который управляет NSView окна, содержащего текстовое поле и прокрутку.Обработка вкладок в представлении Cocoa с текстовым полем и прокруткой.

При запуске приложения NSTextField имеет фокус, а ввод вводит символы в это текстовое поле. Когда я нажимаю клавишу TAB, он теряет фокус. Но ничего больше в интерфейсе, как NSScrollView, не фокусируется. Я не могу сказать, куда идут какие-либо события.

Как перенести фокус на NSScrollView, чтобы события на нем могли повлиять (например, клавиши со стрелками, неявный поиск и т. Д.)?

ответ

1

Во-первых, вы должны попробовать несколько раз нажимать Tab, чтобы увидеть, когда фокус когда-либо попадает в режим прокрутки или возвращается в текстовое поле.

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

Если вы действительно хотите, чтобы ваш профиль прокрутки принимал фокус, вам необходимо переопределить метод -acceptsFirstResponder для возврата YES.

Поведение Tab управляется окном. Он поддерживает ключевой цикл представления. Он может автоматически пересчитывать цикл представления ключей, поскольку представления добавляются и удаляются. Это, наверное, самый надежный способ. См. Свойство autorecalculatesKeyViewLoop.

В качестве альтернативы, вы можете вручную сказать, чтобы он пересчитал, как вам хочется, отключив autorecalculatesKeyViewLoop и позвонив по телефону -recalculateKeyViewLoop.

Или вы можете напрямую настроить цикл просмотра ключей, подключив свойства каждого вида nextKeyView и previousKeyView либо в коде, либо в Interface Builder.

+0

Когда в представлении прокрутки (вид документа) есть несколько подменю, но ни один из них не имеет под-под-представлений, фокус никогда не покидает поля редактирования текста. Но когда пара суб-представлений имеет суб-под-представления (vanilla NSViews), то нажатие TAB несколько раз не показывает фокус на прокрутке, но в конечном итоге возвращается в поле редактирования текста. Длина цикла, по-видимому, связана с количеством под-под-представлений. – jsbox

+0

Отключение «acceptsFirstResponder» в подзапросах очистило ситуацию. Оказывается, что они все еще принимают события mouseDown, поэтому я подумал, что для «acceptsFirstResponder» для них должно быть установлено YES. Но установка «acceptsFirstResponder» для представления прокрутки не изменяет никакого поведения по умолчанию, так что это все еще загадка. – jsbox

+0

Как вы определяете, что просмотр прокрутки не фокусируется? Вы пытались изменить свой «focusRingType»? Это может быть неэффективно, поэтому визуальных изменений не будет. Во всяком случае, как я уже сказал, более типичным для представления документа является принятие фокуса. Например, когда представление таблицы находится внутри прокрутки, это представление таблицы, которое принимает фокус, а не вид прокрутки. –