Есть ли способ определить, когда клавиша Backspace/ Deleteнажата на клавиатуре iPhone на UITextField
пустом месте? Я хочу знать, когда Backspaceнажимается, только если UITextField
пусто.
Основываясь на предложении @Alex Reynolds в комментарии, я добавил следующий код при создании своего текстового поля:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Это уведомление получено ( handleTextFieldChanged
функция вызывается), но все равно не когда я нажимаю Backspaceклавишу в пустом поле. Любые идеи?
Кажется, в этом вопросе есть некоторая путаница. Я хочу получать уведомление при Backspaceнажатии клавиши. Вот и все. Но решение должно работать и тогда, когда UITextField
он уже пуст.
ios
iphone
uitextfield
backspace
Marcc
источник
источник
Ответы:
Это может быть маловероятно, но это может сработать. Попробуйте установить для текста текстового поля символ пробела нулевой ширины
\u200B
. Когда в текстовом поле, которое кажется пустым, нажата клавиша Backspace, оно фактически удаляет ваше пространство. Затем вы можете просто вставить пространство заново.Может не работать, если пользователю удастся переместить курсор влево от места.
источник
UITextField
и реализоватьcanPerformAction:withSender:
вreturn NO
течениеselect:
иselectAll:
действий , если текст равна строке@"\u200B"
.Swift 4:
Подкласс
UITextField
:Реализация:
Objective-C:
Подкласс
UITextField
:Теперь просто добавьте MyTextFieldDelegate в ваш
UIViewController
и установитеUITextFields
myDelegate наself
:источник
ViewController
классе, если я установлю делегат текстового поля на подклассUITextField
вместоUIViewController
deleteBackward()
не будет вызываться , если вамreturn false
вtextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Обновление: см . Ответ JacobCaraballo для примера, который отменяет
-[UITextField deleteBackward]
.Проверьте
UITextInput
, в частности,UIKeyInput
естьdeleteBackward
метод делегата, который всегда вызывается при нажатии клавиши удаления. Если вы делаете что-то простое, вы можете простоUILabel
создать подкласс и привести его в соответствие сUIKeyInput
протоколом, как это сделано с помощью SimpleTextInput и этого примера iPhone UIKeyInput . Примечание:UITextInput
и его родственники (в том числеUIKeyInput
) доступны только в iOS 3.2 и новее.источник
Код, подобный следующему:
Наконец, не забудьте изменить свойство Custom Class текстового поля на MyTextField.
источник
Быстрая реализация:
источник
Я нашел другой способ проще, чем
subclass
решение. Даже немного странно, но работает нормально.Немного странно, результат сравнения -8. Может, в чем-то я ошибаюсь
C Programming
. Но его правильная работа;)источник
strcmp
возврате-1, 0, or 1
? Это было моим пониманием.UITextViewDelegate
методUITextFieldDelegate
.Попробуйте
delegate
Затем проверьте,
range.length == 1
похоже ли это на то, что происходит приbackspace
ударе.источник
пожалуйста, используйте приведенный ниже код, это поможет вам обнаружить клавишу удаления клавиатуры, даже если текстовое поле пусто.
Цель C:
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Swift:
источник
Ответ Никласа Альвеуса помог мне с аналогичной проблемой
Я ограничивал ввод определенным набором символов, но игнорировал обратные пробелы. Так что я проверил его
range.length == 1
перед обрезкойNSString
. Если это правда, я просто возвращаю строку и не обрезаю ее. Увидеть нижеисточник
Для тех, у кого есть проблемы с ответом Джейкоба, я реализовал свой подкласс текстового поля следующим образом, и он отлично работает!
источник
Да, используйте метод ниже, чтобы обнаружить обратное пространство, когда textField пуст.
Необходимо добавить UITextFieldDelegate
yourTextField.delegate = self (НЕОБХОДИМО)
Swift:
Цель C:
источник
Лучшее использование, которое я нашел для обнаружения обратного пространства, - это обнаружение, когда пользователь нажал клавишу возврата в пустом месте
UITextField
. Например, если в почтовом приложении есть «пузырьковые» получатели, когда вы нажимаете клавишу Backspace вUITextField
, он выбирает последнего «пузырькового» получателя.Это можно сделать аналогично ответу Джейкоба Карабальо. Но в ответе Джейкоба, если у
UITextField
него остался один символ, когда вы нажмете backspace, к тому времени, когда будет получено сообщение делегата,UITextField
будет уже пустым, поэтому вы эффективно обнаруживаетеbackspace
текстовое поле с не более чем одним символом.На самом деле, если вы хотите обнаружить
backspace
на aUITextField
с точно нулевым количеством символов (пустым), вы должны отправить сообщениеdelegate
до вызоваsuper deleteBackward
. Например:Интерфейс такого текстового поля будет выглядеть примерно так:
источник
В iOS 6 метод deleteBackward вызывается в UITextField при нажатии кнопки Backspace, в том числе когда поле пусто. Таким образом, вы можете создать подкласс UITextField и предоставить свою собственную реализацию deleteBackward (также вызывая super).
Я все еще поддерживаю iOS 5, поэтому мне понадобится комбинация ответа Эндрю и этого.
источник
:) только для заголовка "Обнаружить обратное пространство", где я использую
UIKeyboardTypeNumberPad
.Сегодня вечером я также встречаю тот же вопрос, и вот мой код, чтобы узнать его:
Потому что с
UIKeyboardTypeNumberPad
, пользователь может вводить только Number или backspace, поэтому, когда длина строки равна 0, это должна быть клавиша backspace.Надеюсь, что это поможет.
источник
Вместо того, чтобы пытаться заранее сконструировать, что БУДЕТ в текстовом поле, или выяснить, какой специальный символ был введен в
shouldChangeCharactersInRange
метод, я бы предложил сделать следующее:Это позволяет вам вызывать метод сразу после завершения текущей операции. Что в этом круто, так это то, что к моменту его завершения измененное значение уже будет в
UITextField
. На этом этапе вы можете просто проверить его длину и / или подтвердить, исходя из того, что там есть.источник
Создание подклассов UITextField у меня не работало на iOS 8.3, deleteBackward никогда не вызывался.
Вот решение, которое я использовал, работает на всех версиях iOS 8 и также должно работать на других версиях iOS.
источник
В файле .h добавьте делегата UIKeyInput
улучшенное форматирование
источник
Я реализовал аналогичное решение с небольшими улучшениями, которые сообщают мне, имеет ли текстовое поле какое-либо значение, когда пользователь нажал на обратное пространство. Это полезно для моего случая, когда я должен сосредоточиться только на другом текстовом поле, если текстовое поле пусто при нажатии кнопки возврата.
источник
Самый топичный ответ упускает одну вещь - возможность определить, было ли текстовое поле пустым или нет.
То есть, когда вы переопределяете метод deleteBackwards () подкласса TextField, вы все равно не знаете, было ли текстовое поле уже пустым. (И до, и после deleteBackwards ()
textField.text!
это пустая строка:""
)Вот мое улучшение, с проверкой на пустоту перед удалением.
1. Создайте протокол делегата, который расширяет UITextFieldDelegate.
2. Подкласс UITextField
3. Внедрите новый протокол делегата.
источник
Комплексный обработчик текстового поля с однозначным номером для Swift 5.1 :
1 шаг
2 шаг
3 шаг
источник
Вот мое решение, основанное на идее @andrew:
где-нибудь например в viewDidLoad
а потом
источник
Вы можете проверить текст текстового представления / поля, чтобы убедиться, что он пуст, и убедиться, что замещающий текст также пуст в методе делегата shouldChangeTextIn.
источник
Что-то вроде этого:
конечно, хеш для одной символьной строки.
источник
Используя метод делегата TextField:
Добавьте следующий код в метод выше, чтобы обнаружить событие удаления
источник
Чтобы не усложнять, вот единственное условие, которое вам нужно проверить
источник
источник
В
UITextViewDelegate
:у меня работает нормально.
обновление для упрощенного китайского пиньинь и китайского рукописного ввода:
на основании документа сказано:
«Если пользователь нажимает
deleteKey
, длина диапазона равна 1, и пустой строковый объект заменяет этот единственный символ».источник
UITextField
, а не оUITextView
.