I have subclassed UITextField and implemented the UIKeyInput protocol's deleteBackward method to detect backspace being pressed. This works fine on iOS 7 but not on iOS 8.
deleteBackward is not called on the UITextField anymore when I press the backspace key.
I've checked the documentation and the release notes and nothing points to the reason why this could happen. Any pointers?
You must look an example for MBContactPicker on github. Deletion of contacts at MBContactPicker via Backspace button on iOS8 tested by me. And it works greatly! You can use its as example.
Author of MBContactPicker use next method: When UITextField must become empty (or before call becomeFirstResponder when it is empty), he save single whitespace symbol there. And then when you press Backspace button (when focus was set to end of text of your UITextField), method
will work. Inside it you must use check like this:
So, you must always control that UITextField contains single whitespace.
This is not hack. So, user willn't noticed about some behaviour was changed
Basically this method detects which button you are pressing (or have just pressed). This input comes in as an NSString. We convert this NSString to a C char type and then compare it to the traditional backspace character (\b). Then if this strcmp is equal to -8, we can detect it as a backspace.
swift 2:
you should use like this
string.characters.count
A lot of people have been saying this is a bug, but being that this problem still exists in the GM I'm starting to think it might be a change in logic. With that said, I wrote this bit of code for my app and have tested it on iOS 7-8.
Add the following method to your
UITextField
subclass.This code is slightly before the red line of private API's, however you should have no problem using it. My app with this code is in the app store.
To explain a little, were calling the super implementation of this method to avoid losing code. After were going to call
-deleteBackward
if there is no text and the iOS version is between 8-8.2.EDIT: 1/22/15
It also might be helpful to subclass the
-deleteBackward
method of your subclassedUITextField
. This fixes a few conditional bugs. One being if you use a custom keyboard. Heres an example of the method.EDIT: 4/13/15
As @Gee.E commented, iOS 8.3 has fixed this issue. The code has been updated to reflect the changes.
This does not explicitly answer the original question but worth nothing that in the documentation for
textField(_:shouldChangeCharactersIn:replacementString:)
, it says:"
string
: The replacement string for the specified range. During typing, this parameter normally contains only the single new character that was typed, but it may contain more characters if the user is pasting text. When the user deletes one or more characters, the replacement string is empty."Thus, we can detect backspaces in a
UITextFieldDelegate
if we implementtextField(_:shouldChangeCharactersIn:replacementString:)
and check if the length ofstring
is 0.A lot of other answers here have used this same logic without referencing the documentation so hopefully getting it right from the source makes people more comfortable using it.
Swift 2.2: