1

I am getting Phone card number form user in UI text field. The format of number is like

123-4567-890

I want that as user types 123 automatically - is inserted in UITextField same after 4567 - and so on.

I Did it using following code in UITextField delegate method:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
       NSLog(@"***** %d",textField.text.length);


             if(textField.text.length == 3) 

             {
                 textField.text  = [textField.text  stringByAppendingString:@"-"];
             }  

       return YES;
}

But the Problem raised while clear the text, When we start clearing.

Last 3 digits 890 clears and then - addded, we cleared it and again added and soooo on so clearing stop at

We clear all the text at a time using

textField.clearButtonMode = UITextFieldViewModeWhileEditing; //To clear all text at a time

But our requirement is user must delete one character at a time.

How to achieve it?

Paras Joshi
  • 20,427
  • 11
  • 57
  • 70
user1645721
  • 653
  • 2
  • 8
  • 18
  • This answer may help if you are looking for dynamic approach. http://stackoverflow.com/a/38560759/3947151 – Tesan3089 Jul 25 '16 at 06:28

2 Answers2

3

During clearing replacementString should be empty @"". So replacement string should be checked also in addition to length check. Like this:

if (textField.text.length == 3 && ![string isEqualToString:@""]) {
    // append -
}
taskinoor
  • 45,586
  • 12
  • 116
  • 142
1

USE: I have seen this somewhere in this forum, It worked for me

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *filter = @"###-####-###";
    if(!filter) return YES;
    NSString *changedString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    if(range.length == 1 &&  string.length < range.length && [[textField.text substringWithRange:range] rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]].location == NSNotFound)
    {
        NSInteger location = changedString.length-1;
        if(location > 0)
        {
            for(; location > 0; location--)
            {
                if(isdigit([changedString characterAtIndex:location]))
                    break;
            }
            changedString = [changedString substringToIndex:location];
        }
    }
    textField.text = filteredStringFromStringWithFilter(changedString, filter);
    return NO;
}

NSString *filteredStringFromStringWithFilter(NSString *string, NSString *filter)
{
     NSUInteger onOriginal = 0, onFilter = 0, onOutput = 0;
     char outputString[([filter length])];
     BOOL done = NO;

     while(onFilter < [filter length] && !done)
     {
         char filterChar = [filter characterAtIndex:onFilter];
         char originalChar = onOriginal >= string.length ? '\0' : [string characterAtIndex:onOriginal];
         switch (filterChar) {
         case '#':
            if(originalChar=='\0')
            {
                done = YES;
                break;
            }
            if(isdigit(originalChar))
            {
                outputString[onOutput] = originalChar;
                onOriginal++;
                onFilter++;
                onOutput++;
            }
            else
            {
                onOriginal++;
            }
            break;
        default:
            outputString[onOutput] = filterChar;
            onOutput++;
            onFilter++;
            if(originalChar == filterChar)
                onOriginal++;
            break;
        }
    }
    outputString[onOutput] = '\0';
    return [NSString stringWithUTF8String:outputString];
}
Haider
  • 4,961
  • 2
  • 18
  • 25
Janani M
  • 423
  • 3
  • 13