Проблема:
У меня UITextField
бок о бок с UIButton
с функцией отправки. Когда пользователь нажимает кнопку отправки, я выполняю простое действие:
- (IBAction)sendMessage: (id)sender {
[self.chatService sendMessage: self.messageTextField.text];
self.messageTextField.text = @""; // here I get exception
}
Теперь, когда пользователь начинает использовать диктовку с клавиатуры, затем нажимает на диктовку (клавиатуру) и сразу же нажимает кнопку отправки, у меня возникает исключение «Диапазон или индекс вне границ».
Возможное решение:
Я заметил, что другие приложения отключают эту кнопку «отправить», когда сервер распознавания речи обрабатывает данные. Это ровно между двумя событиями: пользователь нажимает «готово», и результаты отображаются в текстовом поле. Я хочу решить это таким же образом.
Не могу найти в документации, где можно получить это уведомление. Я нашел UITextInput
протокол, но это не то, что мне нужно.
Похожие темы:
- Использование диктовки - iOS 6 - DidStart - решение неприемлемо (может быть отклонено Apple)
- Отключить кнопку диктовки на клавиатуре iPhone 4S / нового iPad - подход, аналогичный описанному выше
Что я пробовал:
- просто перехватить и игнорировать исключение. Сбой не возник, но виртуальная клавиатура перестала отвечать
- Отключение кнопки отправки, когда
[UITextInputMode currentInputMode].primaryLanguage
равно@"dictation"
. УведомлениеUITextInputCurrentInputModeDidChangeNotification
, сообщающее об окончании режима диктовки, приходит до того, как служба диктовки фиксирует новое значение, и я все еще могу нажать кнопку отправки, чтобы вызвать исключение. Я мог бы добавить задержку приprimaryLanguage
потерях @ значение "диктовка", но мне такой подход не нравится. Скорее всего, эта требуемая задержка зависит от того, насколько быстро реагирует служба распознавания речи. - Я добавил кучу действий по разным событиям (эти события искали в обработке:
UIControlEventEditingDidBegin
,UIControlEventEditingChanged
,UIControlEventEditingDidEnd
,UIControlEventEditingDidEndOnExit
). Хорошо то, что похоже, чтоUIControlEventEditingChanged
запускается именно в желаемые моменты: когда пользователь нажимает «Готово» в режиме диктовки и когда служба фиксирует или завершает диктовку. Так что это моя лучшая концепция на данный момент. Плохо то, что это срабатывает и в других случаях, и нет информации, чтобы отличить, в каком случае это управляющее событие было запущено, поэтому я не знаю, следует ли мне отключать или включать кнопку или делать ничего такого.
primaryLanguage
), поэтому нулевая задержка не является решением. - person Marek R   schedule 04.06.2014