1

我在 UI 文本字段中获取电话卡号码表单用户。数字的格式就像

123-4567-890

我希望用户自动键入 123 -UITextField在 4567 之后插入相同的内容 - 依此类推。

我在UITextField委托方法中使用以下代码做到了:

- (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;
}

但是在清除文本时提出的问题,当我们开始清除时。

最后 3 位数字 890 清除然后 - 添加,我们清除它并再次添加,所以清除停止在

我们使用一次清除所有文本

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

但我们的要求是用户必须一次删除一个字符。

如何实现?

4

2 回答 2

3

清仓replacementString时应清空@""。因此,除了长度检查外,还应检查替换字符串。像这样:

if (textField.text.length == 3 && ![string isEqualToString:@""]) {
    // append -
}
于 2012-10-19T07:03:20.310 回答
1

使用:我在这个论坛的某个地方看到过这个,它对我有用

- (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];
}
于 2014-08-11T12:14:15.383 回答