Вопрос по objective-c, ios, keyboard – Поддержка командных клавиш, клавиш управления и стрелок при подключении внешней клавиатуры

2

У меня есть приложение для iOS, где все, что я хочу сделать, - это обеспечить дополнительную поддержку основных комбинаций клавиш, таких как команда + a, команда + s, команда + x, команда + v и друзья, когда пользователь подключил клавиатуру Bluetooth.

Я знаю, что это возможно. Такие приложения, как Textastic и многие другие приложения для редактирования, поддерживают эти функции.

Я посмотрел на UIResponder (который, по-видимому, используется только всплывающим меню), UIKeyInput, UITextInput [Delegate] и другие документы API без ссылки на то, как это сделать.

Легко поддерживать, какие параметры отображаются в UIMenuController, используя (BOOL) действие canPerformAction: (SEL) с отправителем Sender: (id). Однако этот метод не вызывается, когда подключена клавиатура Bluetooth. Поэтому мне нужно либо реализовать другой метод специально для клавиатуры, либо что-то еще.

Теперь я подозреваю, что текстовая подсистема отвечает за выполнение действий. Однако я не могу найти никакой документации! Кроме того, ни один из методов делегата UITextInput не вызывается при выполнении операции. Я почти думаю, что решение является частным, и мне нужно спросить Apple, в частности, как получить доступ к этим функциям (что я только что сделал).

UPDATE:

positionFromPosition: inDirection: offset: это метод, используемый для обнаружения нажатия клавиши со стрелкой. После того, как iOS вызвал этот метод, он вызывает setSelectedText :. Вам нужно будет проработать остальную часть сантехники.

UPDATE 2:

Я был в состоянии ответить на все вопросы, которые у меня были. Пожалуйста, обратитесь к отмеченному решению для ответов.

Ваш Ответ

2   ответа
0

К сожалению, нет никакого способа сделать это с публичными API. Например, я использую беспроводную клавиатуру с моим ipad, поэтому я уже рассматривал это раньше. Вы можете, однако, реализовать обходной путь, если не возражаете против использования клавиши опции вместо клавиши команды.

Предполагая, что вы делаете тип текстового редактора приложения, вы можете сделать это: опрашивать каждый символ по мере его ввода и сравнивать его с определенными & quot; символами специальных функций & quot; используя оператор switch. Когда пользователь нажимает клавишу, когда опция удерживается, вставляются специальные символы (такие как & # x201C ;, & # xBB ;, & # xFC; и т. Д.). Просто найдите значения Unicode для этих символов и выполните специальное действие, когда нажата одна из этих клавиш. Кроме того, обратите внимание, что удержание Shift в дополнение к клавише выбора выводит другой символ.

Большое вам спасибо за эту информацию! Я посмотрю, что я могу поднять. PeqNP
Нет проблем. Я помню, как использовал приложение (я думаю, что это был Textastic, лучший редактор кода), которое заявило, что оно не может реализовывать сочетания клавиш, но это заставило меня задуматься о проблеме, и именно это решение я и придумал. Было бы интересно увидеть стороннюю библиотеку, которая сделала для этого удобные функции.
Ага. Опция ключ работает. Я пока пользуюсь этим ключом. Спасибо! PeqNP
Я отмечаю это как решение. яknow Есть способ поддержать базовую команду + s, команду + c и друзей. яbelieve UIResponder - это класс, который мне нужно использовать, но он не работает. Я собираюсь обновить основной вопрос, чтобы быть более ясным. PeqNP
Этоcannot быть сделано в iOS, не прибегая к использованию частных API. Система не позволит вам читать клавиши непосредственно с клавиатуры. Извините, но это предполагаемое поведение.
5

Догадаться. Я уже реализовал методы UIMenuController для поддержки вырезания, копирования и вставки. Реализуя эти функцииand подключив Bluetooth-клавиатуру к физическому устройству, вы автоматически получитеbasic параметры команды (a, c, x, v и друзья). Вам необходимо полностью реализовать UIMenuController UIResponderStandardEditActions. Хочу отметить, что в симуляторе iOS это будетnot триггерная команда (a, c, x, v и друзья) действия. Я был в состоянии наблюдать эти функции, работающиеonly когда к физическому устройству была подключена блютуз-клавиатура - даже при том, что «Имитация аппаратной клавиатуры» был включен в симуляторе.

Относительно клавиш управления / опции; когда вы полностью реализуете UITextInput, вы также получите все функциональные возможности перемещения при использовании клавиш со стрелками, клавиш со стрелками + управление, клавиши со стрелками + и т. д. Посмотрите на файл примера кода SimpleTextInput, предоставленный Apple, для лучшей идеи о том, как реализовать это ,

С этим сказал, что вы можетеnot создать свойown комбинации клавиш. Apple попросила меня создать для нее билет, если мне нужны эти функции, которые я не ... Я действительно не хочу поддерживать что-либо большее, чем то, что они предоставили. Таким образом, такие команды, как Command + s (сохранить) и т. Д. В настоящее время невозможны.

Веселая маленькая история для вас; Apple сказала, что то, что я хотел сделать, было невозможно (используя команду + c, command + v и т. Д.) С API. Я думаю, это показывает, насколько вы полезны их техническому опыту.Very разочарование.

Update:

Начиная с iOS 7, Apple упрощает сбор любой ключевой команды, esc и т. Д. Вот пример того, как можно захватывать различные ключи:

return @[[UIKeyCommand keyCommandWithInput:UIKeyInputEscape modifierFlags:0 action:@selector(escapeKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierCommand action:@selector(commandFindPressed:)],
         [UIKeyCommand keyCommandWithInput:@"s" modifierFlags:UIKeyModifierCommand action:@selector(commandSavePressed:)],
         [UIKeyCommand keyCommandWithInput:@"b" modifierFlags:UIKeyModifierControl action:@selector(controlBKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierControl action:@selector(controlFKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"r" modifierFlags:UIKeyModifierControl action:@selector(controlRKeyPressed:)]
         ];
...

- (void)commandSavePressed:(UIKeyCommand *)keyCommand
{
    [self saveFile];
}
Я угадываю "Имитация аппаратной клавиатуры" просто останавливает экранную клавиатуру от появления; Я, конечно, ожидал, что сочетания клавиш симулятора продолжат работать. «Это невозможно» Ответ, вероятно, объясняется тем, что эта функция ориентирована на пользователя (то есть пользователи ожидают, что она будет работать), а не на разработчика (для нее нет API).
@ R.S Я не могу вспомнить все требования. Сначала я бы удостоверился, что ваши методы вызываются, помещая операторы NSLog в каждый из методов. Если это не так, убедитесь, что ваш интерфейс класса определяет, что он реализует протокол. интерфейс MyView: UIView & lt; UITextInput & gt ;. Кроме того, верните TRUE в (BOOL) метод canBecomeFirstResponder. Я полагаю, что вам также может потребоваться установить класс MyView в качестве делегата для экземпляра UITextInputStringTokenizer. Обязательно посмотрите на пример SimpleTextInput, предоставленный Apple. Я думаю, что это поможет. PeqNP
@echamber, мне нужно добавить аналогичную функциональность в мой пользовательский вид - он должен реагировать на определенные сочетания клавиш (вырезать, вставить и т. д.), а также на клавиши курсора. Я получил предыдущую работу на основе вашего ответа выше (реализовать UIResponderStandardEditActions) - Спасибо! Однако мой взгляд не отвечает на нажатие клавиш курсора. Я реализовал UITextInput и все его методы с использованием по сути фиктивного кода, но эти методы, например, positionFromPosition: inDirection: смещение не вызывается (все, что у меня есть, это регистрация внутри этого метода, без реального кода). Есть указатели?
Человек, которого вы спросили, вероятно, не знал, что эта функция существует. Я подозреваю, что тестер UX сказал: «Эй, почему не работает копирование и вставка на аппаратную клавиатуру?» а затем разработчик сказал: «Я знаю! Мы можем подключить его к обратным вызовам UIMenuController & quot ;.
Я, наверное, тоже задал вопрос неправильно. Может быть трудно описать то, что я пытаюсь сделать, когда я понятия не имею, как работают внутренние устройства или что "ожидается". поведение конечного пользователя. API также не описывает побочные эффекты того, как конкретный API будет использовать данные, которые вы предоставляете своей системе. Например, я понятия не имел, что UIMenController также использовался для обеспечения функциональности клавиш быстрого доступа. У меня может быть слишком большое ожидание, когда дело доходит до ответа Apple. Я думал, что я был ясен, но возможно они действительно полагали, что я имел в виду кое-что еще PeqNP

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