【问题标题】:Format Phone Number Real-Time using NBAsYouTypeFormatter使用 NBAsYouTypeFormatter 实时格式化电话号码
【发布时间】:2015-06-21 11:09:27
【问题描述】:

我到处搜索,看到了很多解决方案,但其中大部分确实是“hackish”并且容易出错。

我正在尝试使用 libPhoneNumber iOS 类 NBAsYouTypeFormatter 格式化 UITextField 上的电话号码。

但是,我找不到合适的使用方法。

以下是我的尝试。 (来自这个帖子Phone number format ios

      var asYouTypeFormatter = NBAsYouTypeFormatter(regionCode: "US");

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField == phoneTextField {
        if range.length == 0 {
            textField.text = asYouTypeFormatter.inputDigit(textField.text + string);
        }
        else if range.length == 1 {
            textField.text = asYouTypeFormatter.removeLastDigit();
        }
        return false;
    }
    return true;
}

这段代码确实检测到range.length,并且它没有考虑到如果用户选择一个或多个字符然后输入

如果用户这样做,将导致它不是类型。

有没有人找到一个更优雅的方法来解决这个问题?

【问题讨论】:

    标签: ios swift uitextfield libphonenumber


    【解决方案1】:
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if textField == phoneTextField {
            if range.length == 0 {
                textField.text = asYouTypeFormatter.inputDigit(textField.text + string);
            } else {
                // take the resulting string after the replacement
                var resultString = textField.text.replacingCharacters(in: range, 
                        with: replacementString)
                // prepare the string to be usable by the NBAsYouTypeFormatter
                resultString = String(string.characters.filter { "01234567890+".characters.contains($0)
                // set the result on the text field 
                textField.text = asYouTypeFormatter.inputString(resultString);
            }
            return false;
        }
        return true;
    }
    

    注意:我是用 Objective C 写的,我没有测试 Swift 语法,但是这个解决方案的逻辑对我有用;

    这是我的 Objective-C 工作代码:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
        NSString *resultString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        // This is to let the user clear the text field
        if ([resultString isEqualToString:@""]) { return YES; };
    
        NBAsYouTypeFormatter *formatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:[[NSLocale currentLocale] countryCode]];
    
        NSCharacterSet *allowedPhoneCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"+0123456789"];
    
        resultString = [[resultString componentsSeparatedByCharactersInSet:
                                [allowedPhoneCharacterSet invertedSet]]
                               componentsJoinedByString:@""];
    
        dispatch_async(dispatch_get_main_queue(), ^{
            textField.text = [formatter inputString:resultString];
        });
    
        return NO;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多