How to insert a row automatically when editing user UITEXTFIELD

I want my uitextfield to look like XXX.XXX.XXX/XX at the end of the input.

To limit the length, I use this:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  {
    if (textField == _cpfField) {

        NSUInteger newLength = [textField.text length] + [string length] - range.length;
        NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
        NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
        return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
    } else{
        return YES;
    }

}

The problem is how to insert "." and "/" while the user is still editing it.

+4
source share
2 answers

The following code should do the following:

  • Limit the number of characters that can be entered / inserted in the text field
  • Automatically add periods and slashes in appropriate places.
  • Prevention of problems by the user by copying / pasting a line that already has the necessary periods / slashes

, ; , .

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *text = textField.text;

    // If we're trying to add more than the max amount of characters, don't allow it
    if ([text length] == 14 && range.location > 13) {
          return NO; 
    }

    // First lets add the whole string we're going for
    text = [text stringByReplacingCharactersInRange:range withString:string];

    // Now remove spaces, periods, and slashes (since we'll add these automatically in a minute)
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    text = [text stringByReplacingOccurrencesOfString:@"." withString:@""];
    text = [text stringByReplacingOccurrencesOfString:@"/" withString:@""];

    // We need to use an NSMutableString to do insertString calls in a moment
    NSMutableString *mutableText = [text mutableCopy];

    // Every 4th char will be a '.', but we don't want to check more than the first 8 characters
    for (NSUInteger i = 3; i < mutableText.length && i < 8; i += 4) {
        [mutableText insertString:@"." atIndex:i];
    }
    // If the text is more than 11 characters, we also want to insert a '/' at the 11th character index
    if (mutableText.length > 11) {
        [mutableText insertString:@"/" atIndex:11];
    }

    // lets set text to our new string
    text = mutableText;

    // Now, lets check if we need to cut off extra characters (like if the person pasted a too-long string)
    if (text.length > 14) {
        text = [text stringByReplacingCharactersInRange:NSMakeRange(14, mutableText.length-14) withString:@""];
    }

    // Finally, set the textfield to our newly modified string!
    textField.text = text;

    return NO;
}
+10
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *text = textField.text;
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@"." withString:@""];

    // Do your length checking here

    NSMutableString *mutableText = [text mutableCopy];

    // Every 4th char will be a .
    for (NSUInteger i = 3; i < mutableText.length; i += 4) {
        [mutableText insertString:@"." atIndex:i];
    }

    textField.text = mutableText;

    return NO;
}
+3

All Articles