Search code examples
cocoa-touchios6uitextfielduitextfielddelegate

iOS 6 UITextField Secure - How to detect backspace clearing all characters?


In iOS 6 if you type text into a secure text field, change to another text field, then come back to the secure text field and hit backspace, all of the characters are removed. I am fine with this happening, however, I am trying to enable/disable a button based on if this secure text field has characters in it or not. I know how to determine what characters are in the fields and if a backspace is hit but I am having trouble determining how to detect if clearing of all the characters is happening.

This is the delegate method I'm using to get the new text of a field, but, I can't seem to figure out how to get the new text (assuming the new text would just be a blank string) if a backspace is hit that clears all the characters.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //returns the "new text" of the field
    NSString * text = [textField.text stringByReplacingCharactersInRange:range withString:string];
}

Any help is much appreciated.

Thanks!


Solution

  • I use this solution. It does not need local variables and sets the cursor position correctly, after deleting the char.

    It's a mashup of this solutions:

    
     - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        {
            if (range.location > 0 && range.length == 1 && string.length == 0)
            {
                // Stores cursor position
                UITextPosition *beginning = textField.beginningOfDocument;
                UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
                NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length;
    
                // Save the current text, in case iOS deletes the whole text
                NSString *text = textField.text;
    
    
                // Trigger deletion
                [textField deleteBackward];
    
    
                // iOS deleted the entire string
                if (textField.text.length != text.length - 1)
                {
                    textField.text = [text stringByReplacingCharactersInRange:range withString:string];
    
                    // Update cursor position
                    UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset];
                    UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition];
                    [textField setSelectedTextRange:newSelectedRange];
                }
    
                return NO;
            }
    
            return YES;
        }