In a previous post, I showed you how to trim non-alphanumeric characters from a string. Here I’ll go more in-depth and show a method that I wrote to restrict text entry in a UITextField
to alphanumeric characters. Since I also wanted the characters to be uppercase, I’ll also ensure that only uppercase characters are allowed.
This should all happen in the - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
method of your UITextField
’s delegate (which, of course, must implement the UITextFieldDelegate
protocol). I’ve implemented it as follows:
- ( BOOL )textField:( UITextField * )textField shouldChangeCharactersInRange:( NSRange )range replacementString:( NSString * )string { /* * We only want uppercase letters and numbers in this text field, so if * this method is adding something else, we don't want it. But we also * want to support copy-and-paste, so it's not always going to be one * character added. */ BOOL shouldAllowChange = YES;
The shouldAllowChange
variable is set to YES
initially because we want to allow this change when possible. The method will test the string to see if it meets criteria for rejection as we move forward.
NSMutableString *newReplacement = [[ NSMutableString alloc ] initWithString:[ string uppercaseString ]]; if ( ! [ string isEqualToString:newReplacement ]) { shouldAllowChange = NO; }
First, we define newReplacement
. It’s an NSMutableString
so that if we discover non-alphanumeric characters in it, we can remove them on-the-fly. It also serves as a convenient string against which we can test to see if string
is already uppercase.
NSCharacterSet *desiredCharacters = [ NSCharacterSet alphanumericCharacterSet ]; for ( NSUInteger i = 0; i < [ newReplacement length ]; i++ ) { unichar currentCharacter = [ newReplacement characterAtIndex:i ]; if ( ! [ desiredCharacters characterIsMember:currentCharacter ]) { shouldAllowChange = NO; [ newReplacement deleteCharactersInRange:NSMakeRange( i, 1 )]; i--; } }
In this section, we define the NSCharacterSet
that we want to work with - in this case, the alphanumeric character set. We go through one character by a time and if the current character isn’t alphanumeric, we remove it from the NSMutableString
(decrementing i
so that we don’t inadvertently skip a character) and set our shouldAllowChange
flag accordingly.
if ( shouldAllowChange ) { [ newReplacement release ]; return YES; } else { [ textField setText:[[ textField text ] stringByReplacingCharactersInRange:range withString:newReplacement ]]; [ newReplacement release ]; return NO; } }
To finish, if shouldAllowChange
is still true, we return YES
and allow the replacement characters to be added. Otherwise, we return NO
, but not before using our replacement replacement string (say that ten times fast) to manually edit the text field’s text. The end result is a text field that will consist only of uppercase letters and numbers.