【问题标题】:UITextField for Phone Number电话号码的 UITextField
【发布时间】:2010-11-17 19:14:07
【问题描述】:

我想知道如何格式化用于电话号码的文本字段(例如 iPhone 上的“添加新联系人”页面。当我输入新手机时,例如 1236890987,它会格式化它如 (123) 689-0987。) 我已经把键盘设置为数字键盘了。

【问题讨论】:

    标签: iphone objective-c cocoa-touch iphone-sdk-3.0


    【解决方案1】:

    这是我的解决方案.. 效果很好!实时格式化电话号码。注意:这是 10 位数的电话号码。目前它会自动将其格式化为 (xxx) xxx-xxxx.. 调整到您的内心喜悦。

    首先在您的shouldChangeCharactersInRange 中,您要收集电话文本字段的整个字符串并将其传递给验证/格式化函数。

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString* totalString = [NSString stringWithFormat:@"%@%@",textField.text,string];
    
    // if it's the phone number textfield format it.
    if(textField.tag==102 ) {
        if (range.length == 1) {
            // Delete button was hit.. so tell the method to delete the last char.
            textField.text = [self formatPhoneNumber:totalString deleteLastChar:YES];
        } else {
            textField.text = [self formatPhoneNumber:totalString deleteLastChar:NO ];
        }
        return false;
    }
    
    return YES; 
    }
    

    这里是电话号码的格式。正则表达式可能会被清理一下。但我已经测试了这段代码一段时间,似乎通过了所有的铃铛。请注意,我们还使用此功能删除电话号码中的号码。在这里工作更容易一些,因为我们已经去掉了所有其他非数字。

     -(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar {
    if(simpleNumber.length==0) return @"";
    // use regex to remove non-digits(including spaces) so we are left with just the numbers 
    NSError *error = NULL;
     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\s-\\(\\)]" options:NSRegularExpressionCaseInsensitive error:&error];
     simpleNumber = [regex stringByReplacingMatchesInString:simpleNumber options:0 range:NSMakeRange(0, [simpleNumber length]) withTemplate:@""];
    
    // check if the number is to long
    if(simpleNumber.length>10) {
        // remove last extra chars.
        simpleNumber = [simpleNumber substringToIndex:10];
    }
    
    if(deleteLastChar) {
        // should we delete the last digit?
        simpleNumber = [simpleNumber substringToIndex:[simpleNumber length] - 1];
    }
    
    // 123 456 7890
    // format the number.. if it's less then 7 digits.. then use this regex.
    if(simpleNumber.length<7)
    simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d+)"
                                                               withString:@"($1) $2"
                                                                  options:NSRegularExpressionSearch
                                                                    range:NSMakeRange(0, [simpleNumber length])];
    
    else   // else do this one..
        simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d{3})(\\d+)"
                                                               withString:@"($1) $2-$3"
                                                                  options:NSRegularExpressionSearch
                                                                    range:NSMakeRange(0, [simpleNumber length])];
    return simpleNumber;
    }
    

    【讨论】:

    • 运行良好。此外,您可以在输入完整号码后关闭键盘,方法是在 formatPhoneNumber: 方法中添加以下内容:if (simpleNumber.length == 10 &amp;&amp; deleteLastChar == NO) { [textField resignFirstResponder]; }
    • 如何将它连接到实际的文本字段?
    • 尝试使用以下代码添加您的方法。这是正确的吗?它不工作。 case 3: { cell.textLabel.text = @"Phone" ; tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"]; phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad; [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES]; [cell addSubview:phoneFieldTextField]; break ; }
    • 要将其连接到界面构建器中的文本字段,您需要确保将文本字段的委托设置为文件所有者(很可能)。然后将上述两种方法添加到您的 .m 文件中。目前它通过使用“textField.tag==102”语句确保它是一个电话文本字段。可以在界面生成器中设置文本字段(或任何其他 ui 对象)的标签。所以在这种情况下,我在界面生成器中将标签设置为 102。
    • 顺便说一句:似乎我应该得到答案?是的,也许?
    【解决方案2】:

    在 Swift 4 中你可以这样做:

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
    {
        if (textField == phoneTextField) {
            let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
            let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
    
            let decimalString = components.joined(separator: "") as NSString
            let length = decimalString.length
            let hasLeadingOne = length > 0 && decimalString.hasPrefix("1")
    
            if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 {
                let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int
    
                return (newLength > 10) ? false : true
            }
            var index = 0 as Int
            let formattedString = NSMutableString()
    
            if hasLeadingOne {
                formattedString.append("1 ")
                index += 1
            }
            if (length - index) > 3 {
                let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
                formattedString.appendFormat("(%@)", areaCode)
                index += 3
            }
            if length - index > 3 {
                let prefix = decimalString.substring(with: NSMakeRange(index, 3))
                formattedString.appendFormat("%@-", prefix)
                index += 3
            }
    
            let remainder = decimalString.substring(from: index)
            formattedString.append(remainder)
            textField.text = formattedString as String
            return false
        }
        else {
            return true
        }
    }
    

    【讨论】:

    • 谢谢,vikzilla。很有帮助。
    • 可能需要调整:let decimalString = components.joinWithSeparator("") as NSString
    • 应该让 hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (49 as unichar) 甚至让 hasLeadingOne = length > 0 && decimalString.hasPrefix("1")
    • 如何将其更改为“(+61) 428-74-5183”这种格式?
    • 别忘了在 viewDidLoad textfield.delegate = self 中添加 UITextFieldDelegate & :)
    【解决方案3】:

    Vikzilla 为 Swift 3 更新了答案:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        if textField == phoneTextField {
    
            let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
            let components = (newString as NSString).components(separatedBy: NSCharacterSet.decimalDigits.inverted)
    
            let decimalString = components.joined(separator: "") as NSString
            let length = decimalString.length
            let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)
    
            if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 {
                let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int
    
                return (newLength > 10) ? false : true
            }
            var index = 0 as Int
            let formattedString = NSMutableString()
    
            if hasLeadingOne {
                formattedString.append("1 ")
                index += 1
            }
            if (length - index) > 3 {
                let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
                formattedString.appendFormat("(%@)", areaCode)
                index += 3
            }
            if length - index > 3 {
                let prefix = decimalString.substring(with: NSMakeRange(index, 3))
                formattedString.appendFormat("%@-", prefix)
                index += 3
            }
    
            let remainder = decimalString.substring(from: index)
            formattedString.append(remainder)
            textField.text = formattedString as String
            return false
    
        } else {
            return true
        }
    }
    

    【讨论】:

    • 如何将其更改为“(+61) 428-74-5183”这种格式?
    【解决方案4】:

    我已经为此苦苦挣扎了几个小时,这就是我所拥有的:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
         {
        NSUInteger currentLength = textField.text.length;
        NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet];        
    
        if (range.length == 1) {
            return YES;
        }
    
    
        if ([numbers characterIsMember:[string characterAtIndex:0]]) {
    
    
            if ( currentLength == 3 ) 
            {
    
                if (range.length != 1) 
                {
    
                    NSString *firstThreeDigits = [textField.text substringWithRange:NSMakeRange(0, 3)];
    
                    NSString *updatedText;
    
                    if ([string isEqualToString:@"-"]) 
                    {
                        updatedText = [NSString stringWithFormat:@"%@",firstThreeDigits];
                    }
    
                    else 
                    {
                        updatedText = [NSString stringWithFormat:@"%@-",firstThreeDigits];
                    }
    
                    [textField setText:updatedText];
                }           
            }
    
            else if ( currentLength > 3 && currentLength < 8 ) 
            {
    
                if ( range.length != 1 ) 
                {
    
                    NSString *firstThree = [textField.text substringWithRange:NSMakeRange(0, 3)];
                    NSString *dash = [textField.text substringWithRange:NSMakeRange(3, 1)];
    
                    NSUInteger newLenght = range.location - 4;
    
                    NSString *nextDigits = [textField.text substringWithRange:NSMakeRange(4, newLenght)];
    
                    NSString *updatedText = [NSString stringWithFormat:@"%@%@%@",firstThree,dash,nextDigits];
    
                    [textField setText:updatedText];
    
                }
    
            }
    
            else if ( currentLength == 8 ) 
            {
    
                if ( range.length != 1 ) 
                {
                    NSString *areaCode = [textField.text substringWithRange:NSMakeRange(0, 3)];
    
                    NSString *firstThree = [textField.text substringWithRange:NSMakeRange(4, 3)];
    
                    NSString *nextDigit = [textField.text substringWithRange:NSMakeRange(7, 1)];
    
                    [textField setText:[NSString stringWithFormat:@"(%@) %@-%@",areaCode,firstThree,nextDigit]];
                }
    
            }
        }
    
        else {
            return NO;
        }
    
        return YES;
    }
    

    我希望有人可以贡献。

    【讨论】:

      【解决方案5】:

      以下函数在 textField 上强制执行 (999)333-5555 格式:

      斯威夫特 3:

      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
              if (textField == self.phone){
                  let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
                  let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
      
                  let decimalString = components.joined(separator: "") as NSString
                  let length = decimalString.length
                  let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)
      
                  if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 {
                      let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int
      
                      return (newLength > 10) ? false : true
                  }
                  var index = 0 as Int
                  let formattedString = NSMutableString()
      
                  if hasLeadingOne {
                      formattedString.append("1 ")
                      index += 1
                  }
                  if (length - index) > 3 {
                      let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
                      formattedString.appendFormat("(%@)", areaCode)
                      index += 3
                  }
                  if length - index > 3 {
                      let prefix = decimalString.substring(with: NSMakeRange(index, 3))
                      formattedString.appendFormat("%@-", prefix)
                      index += 3
                  }
      
                  let remainder = decimalString.substring(from: index)
                  formattedString.append(remainder)
                  textField.text = formattedString as String
                  return false
              } else {
                  return true
              }
          }
      

      【讨论】:

        【解决方案6】:

        这是我的看法。这与 Apple 在电话和联系人应用程序中所做的很接近(至少当您的地区设置为美国时,我不确定每个地区的行为是否会发生变化)。

        我对格式化为1 (123) 123-1234 并支持更长的数字而不进行格式化特别感兴趣。在其他解决方案中仅检查range.length == 1(用于删除/退格)也存在一个错误,该错误会阻止用户选择整个字符串或部分字符串并按下删除/退格键,这解决了这种情况。

        当您开始在中间选择一个范围并进行编辑时,会发生一些奇怪的行为,由于设置了文本字段值,光标总是在字符串的末尾结束。我不确定如何在UITextField 中重新定位光标,我认为Apple 实际上在联系人和电话应用程序中使用UITextView,因为它们在执行此内联格式时保持光标位置,它们似乎可以处理所有细微差别!我希望他们能开箱即用地给我们这个。

        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
            NSMutableString *newString = [NSMutableString stringWithString:textField.text];
            [newString replaceCharactersInRange:range withString:string];
            NSString *phoneNumberString = [self formattedPhoneNumber:newString];
        
            if (range.length >= 1) { // backspace/delete
                if (phoneNumberString.length > 1) {
                    // the way we format the number it is possible that when the user presses backspace they are not deleting the last number
                    // in the string, so we need to check if the last character is a number, if it isn't we need to delete everything after the
                    // last number in the string
                    unichar lastChar = [phoneNumberString characterAtIndex:phoneNumberString.length-1];
                    NSCharacterSet *numberCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890#*"];
                    if (![numberCharacterSet characterIsMember:lastChar]) {
                        NSRange numberRange = [phoneNumberString rangeOfCharacterFromSet:numberCharacterSet options:NSBackwardsSearch];
                        phoneNumberString = [phoneNumberString substringToIndex:numberRange.location+1];
                    }
                }
            }
        
            textField.text = phoneNumberString;
        
            return NO;
        }
        
        - (NSString *)formattedPhoneNumber:(NSString *)string {
            NSString *formattedPhoneNumber = @"";
            NSCharacterSet *numberCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890#*+"];
        
            NSRange pauseRange = [string rangeOfString:@","];
            NSRange waitRange = [string rangeOfString:@";"];
        
        
            NSString *numberStringToFormat = nil;
            NSString *numberStringToAppend = @"";
            if (pauseRange.location != NSNotFound || waitRange.location != NSNotFound) {
                NSString *choppedString = [string substringToIndex:MIN(pauseRange.location, waitRange.location)];
                numberStringToFormat = [[choppedString componentsSeparatedByCharactersInSet:[numberCharacterSet invertedSet]] componentsJoinedByString:@""];
                numberStringToAppend = [string substringFromIndex:MIN(pauseRange.location, waitRange.location)];
            } else {
                numberStringToFormat = [[string componentsSeparatedByCharactersInSet:[numberCharacterSet invertedSet]] componentsJoinedByString:@""];
            }
        
            if ([numberStringToFormat hasPrefix:@"0"] || [numberStringToFormat hasPrefix:@"11"]) {
                // numbers starting with 0 and 11 should not be formatted
                formattedPhoneNumber = numberStringToFormat;
        
            } else if ([numberStringToFormat hasPrefix:@"1"]) {
                if (numberStringToFormat.length <= 1) {
                    // 1
                    formattedPhoneNumber = numberStringToFormat;
                } else if (numberStringToFormat.length <= 4) {
                    // 1 (234)
                    NSString *areaCode = [numberStringToFormat substringFromIndex:1];
                    if (areaCode.length < 3) {
                        formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@",
                                                [numberStringToFormat substringFromIndex:1]]; // 1 (XXX)
                    } else {
                        formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) ",
                                                [numberStringToFormat substringFromIndex:1]]; // 1 (XXX)
                    }
        
                } else if (numberStringToFormat.length <= 7) {
                    // 1 (234) 123
                    formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) %@",
                                            [numberStringToFormat substringWithRange:NSMakeRange(1, 3)], //1 (XXX) 123
                                            [numberStringToFormat substringFromIndex:4]]; // 1 (234) XXX
        
                } else if (numberStringToFormat.length <= 11) {
                    // 1 (123) 123-1234
                    formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) %@-%@",
                                            [numberStringToFormat substringWithRange:NSMakeRange(1, 3)], //1 (XXX) 123
                                            [numberStringToFormat substringWithRange:NSMakeRange(4, 3)], //1 (234) XXX-1234
                                            [numberStringToFormat substringFromIndex:7]]; // 1 (234) 123-XXXX
                } else {
                    // 1123456789012....
                    formattedPhoneNumber = numberStringToFormat;
                }
            } else {
                if (numberStringToFormat.length <= 3) {
                    // 123
                    formattedPhoneNumber = numberStringToFormat;
                } else if (numberStringToFormat.length <= 7) {
                    // 123-1234
                    formattedPhoneNumber = [NSString stringWithFormat:@"%@-%@",
                                            [numberStringToFormat substringToIndex:3], // XXX-1234
                                            [numberStringToFormat substringFromIndex:3]]; // 123-XXXX
                } else if (numberStringToFormat.length <= 10) {
                    // (123) 123-1234
                    formattedPhoneNumber = [NSString stringWithFormat:@"(%@) %@-%@",
                                            [numberStringToFormat substringToIndex:3], // (XXX) 123-1234
                                            [numberStringToFormat substringWithRange:NSMakeRange(3, 3)], // (123) XXX-1234
                                            [numberStringToFormat substringFromIndex:6]]; // (123) 123-XXXX
        
                } else {
                    // 123456789012....
                    formattedPhoneNumber = numberStringToFormat;
                }
            }
        
            if (numberStringToAppend.length > 0) {
                formattedPhoneNumber = [NSString stringWithFormat:@"%@%@", formattedPhoneNumber, numberStringToAppend];
            }
        
            return formattedPhoneNumber;
        }
        

        【讨论】:

          【解决方案7】:

          您可以在需要更新 textField 时调用此方法:

          extension String {
              func applyPatternOnNumbers(pattern: String, replacmentCharacter: Character) -> String {
                  var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
                  for index in 0 ..< pattern.count {
                      guard index < pureNumber.count else { return pureNumber }
                      let stringIndex = String.Index(utf16Offset: index, in: pattern)
                      let patternCharacter = pattern[stringIndex]
                      guard patternCharacter != replacmentCharacter else { continue }
                      pureNumber.insert(patternCharacter, at: stringIndex)
                  }
                  return pureNumber
              }
          }
          

          例子:

           guard let text = textField.text else { return }
           textField.text = text.applyPatternOnNumbers(pattern: "+# (###) ###-####", replacmentCharacter: "#")
          

          【讨论】:

            【解决方案8】:

            此解决方案非常适用于没有国际拨号前缀 (+1) 且没有分机号的北美号码。该号码将被格式化为“(212) 555-1234”。它将预先输入“)”和“-”,但也会正确删除。

            这是您的文本字段委托应实现的-textField:shouldChangeCharactersInRange:replacementString

            - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
                if (textField == self.myPhoneTextField) {
                    NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string];
                    BOOL deleting = [newText length] < [textField.text length];
            
                    NSString *stripppedNumber = [newText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [newText length])];
                    NSUInteger digits = [stripppedNumber length];
            
                    if (digits > 10)
                        stripppedNumber = [stripppedNumber substringToIndex:10];
            
                    UITextRange *selectedRange = [textField selectedTextRange];
                    NSInteger oldLength = [textField.text length];
            
                    if (digits == 0)
                        textField.text = @"";
                    else if (digits < 3 || (digits == 3 && deleting))
                        textField.text = [NSString stringWithFormat:@"(%@", stripppedNumber];
                    else if (digits < 6 || (digits == 6 && deleting))
                        textField.text = [NSString stringWithFormat:@"(%@) %@", [stripppedNumber substringToIndex:3], [stripppedNumber substringFromIndex:3]];
                    else
                        textField.text = [NSString stringWithFormat:@"(%@) %@-%@", [stripppedNumber substringToIndex:3], [stripppedNumber substringWithRange:NSMakeRange(3, 3)], [stripppedNumber substringFromIndex:6]];
            
                    UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:[textField.text length] - oldLength];
                    UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:newPosition];
                    [textField setSelectedTextRange:newRange];
            
                    return NO;
                }
            
                return YES;
            }
            

            【讨论】:

              【解决方案9】:

              来自 Vikzilla 的 Swift 2.0 更新答案:

              func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
                  sendButton.enabled = true
                  let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
                  let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
              
                  let decimalString : String = components.joinWithSeparator("")
                  let length = decimalString.characters.count
                  let decimalStr = decimalString as NSString
                  let hasLeadingOne = length > 0 && decimalStr.characterAtIndex(0) == (1 as unichar)
              
                  if length == 0 || (length > 10 && !hasLeadingOne) || length > 11
                  {
                      let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int
              
                      return (newLength > 10) ? false : true
                  }
                  var index = 0 as Int
                  let formattedString = NSMutableString()
              
                  if hasLeadingOne
                  {
                      formattedString.appendString("1 ")
                      index += 1
                  }
                  if (length - index) > 3
                  {
                      let areaCode = decimalStr.substringWithRange(NSMakeRange(index, 3))
                      formattedString.appendFormat("(%@)", areaCode)
                      index += 3
                  }
                  if length - index > 3
                  {
                      let prefix = decimalStr.substringWithRange(NSMakeRange(index, 3))
                      formattedString.appendFormat("%@-", prefix)
                      index += 3
                  }
              
                  let remainder = decimalStr.substringFromIndex(index)
                  formattedString.appendString(remainder)
                  textField.text = formattedString as String
                  return false
              }
              

              对我来说很好,希望它也对你有用:)

              【讨论】:

              • 那里有一个无关的 sendButton 引用
              【解决方案10】:

              Swift 4(并且没有 NSString)

              对于格式 +X(XXX)XXX-XXXX 或 +X(XXX)XXX-XX-XX 更新和轻微

              class ViewController: UIViewController, UITextFieldDelegate {
              
                  var myPhoneNumber = String()
              
                  @IBOutlet weak var phoneTextField: UITextField!
              
                  override func viewDidLoad() {
                      super.viewDidLoad()
                      phoneTextField.delegate = self
                      phoneTextField.keyboardType = .phonePad
                  }
              
                  func textFieldDidBeginEditing(_ textField: UITextField) {
                      if (textField == self.phoneTextField) && textField.text == ""{
                          textField.text = "+7(" //your country code default
                      }
                  }
              
                  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
              
                      if textField == phoneTextField {
                          let res = phoneMask(phoneTextField: phoneTextField, textField: textField, range, string)
                          myPhoneNumber = res.phoneNumber != "" ? "+\(res.phoneNumber)" : ""
                          print("Phone - \(myPhoneNumber)  MaskPhone=\(res.maskPhoneNumber)")
                          if (res.phoneNumber.count == 11) || (res.phoneNumber.count == 0) {
                              //phone number entered or completely cleared
                              print("EDIT END: Phone = \(myPhoneNumber)  MaskPhone = \(res.maskPhoneNumber)")
                          }
                          return res.result
                      }
                      return true
                  }
              }
              
              extension UITextFieldDelegate {
                  func phoneMask(phoneTextField: UITextField, textField: UITextField, _ range: NSRange, _ string: String) -> (result: Bool, phoneNumber: String, maskPhoneNumber: String) {
                      let oldString = textField.text!
                      let newString = oldString.replacingCharacters(in: Range(range, in: oldString)!, with: string)
                      //in numString only Numeric characters
                      let components = newString.components(separatedBy: CharacterSet.decimalDigits.inverted)
                      let numString = components.joined(separator: "")
              
                      let length = numString.count
                      let maxCharInPhone = 11
              
                      if newString.count < oldString.count { //backspace to work
                          if newString.count <= 2 { //if now "+7(" and push backspace
                              phoneTextField.text = ""
                              return (false, "", "")
                          } else {
                              return (true, numString, newString) //will not in the process backspace
                          }
                      }
              
                      if length > maxCharInPhone { // input is complete, do not add characters
                          return (false, numString, newString)
                      }
                      var indexStart, indexEnd: String.Index
                      var maskString = "", template = ""
                      var endOffset = 0
              
                      if newString == "+" { // allow add "+" if first Char
                          maskString += "+"
                      }
                      //format +X(XXX)XXX-XXXX
                      if length > 0 {
                          maskString += "+"
                          indexStart = numString.index(numString.startIndex, offsetBy: 0)
                          indexEnd = numString.index(numString.startIndex, offsetBy: 1)
                          maskString += String(numString[indexStart..<indexEnd]) + "("
                      }
                      if length > 1 {
                          endOffset = 4
                          template = ")"
                          if length < 4 {
                              endOffset = length
                              template = ""
                          }
                          indexStart = numString.index(numString.startIndex, offsetBy: 1)
                          indexEnd = numString.index(numString.startIndex, offsetBy: endOffset)
                          maskString += String(numString[indexStart..<indexEnd]) + template
                      }
                      if length > 4 {
                          endOffset = 7
                          template = "-"
                          if length < 7 {
                              endOffset = length
                              template = ""
                          }
                          indexStart = numString.index(numString.startIndex, offsetBy: 4)
                          indexEnd = numString.index(numString.startIndex, offsetBy: endOffset)
                          maskString += String(numString[indexStart..<indexEnd]) + template
                      }
                      var nIndex: Int; nIndex = 7
              //            //format +X(XXX)XXX-XX-XX  -> if need uncoment
              //            nIndex = 9
              //
              //            if length > 7 {
              //                endOffset = 9
              //                template = "-"
              //                if length < 9 {
              //                    endOffset = length
              //                    template = ""
              //                }
              //                indexStart = numString.index(numString.startIndex, offsetBy: 7)
              //                indexEnd = numString.index(numString.startIndex, offsetBy: endOffset)
              //                maskString += String(numString[indexStart..<indexEnd]) + template
              //            }
                      if length > nIndex {
                          indexStart = numString.index(numString.startIndex, offsetBy: nIndex)
                          indexEnd = numString.index(numString.startIndex, offsetBy: length)
                          maskString += String(numString[indexStart..<indexEnd])
                      }
                      phoneTextField.text = maskString
                      if length == maxCharInPhone {
                          //dimiss kayboard
                          phoneTextField.endEditing(true)
                          return (false, numString, newString)
                      }
                      return (false, numString, newString)
                  }
              }
              

              【讨论】:

                【解决方案11】:

                这是我从英国的角度略微本地化的 Swift 2 代码。

                它将格式化:

                +11234567890 为 +1 (123) 456 7890

                +33123456789 为 +33 1 23 45 67 89

                +441234123456 为 +44 1234 123456(已进一步本地化为 01234 123456),因为我不需要查看英国号码的国家/地区代码。

                调用如下:

                initInternationalPhoneFormats() //this just needs to be done once
                
                var formattedNo = formatInternationalPhoneNo("+11234567890")
                

                如果您有任何其他国家/地区代码和格式或代码改进,请告诉我。

                享受吧。

                import Cocoa
                
                extension String
                {
                    //extension from http://stackoverflow.com/questions/24092884/get-nth-character-of-a-string-in-swift-programming-language
                
                    subscript (i: Int) -> Character
                    {
                        return self[self.startIndex.advancedBy(i)]
                    }
                
                }
                
                var phoneNoFormat = [String : String]()
                var localCountryCode: String? = "+44"
                
                func initInternationalPhoneFormats() 
                {
                    if phoneNoFormat.count == 0
                    {
                         phoneNoFormat["0"] = "+44 #### ######" //local no (UK)
                         phoneNoFormat["02"] = "+44 ## #### #####" //local no (UK) London
                
                         phoneNoFormat["+1"] = "+# (###) ###-####" //US and Canada
                
                         phoneNoFormat["+234"] = "+## # ### ####" //Nigeria
                         phoneNoFormat["+2348"] = "+## ### ### ####" //Nigeria Mobile
                
                         phoneNoFormat["+31"] = "+## ### ## ## ##" //Netherlands
                         phoneNoFormat["+316"] = "+## # ## ## ## ##" //Netherlands Mobile
                         phoneNoFormat["+33"] = "+## # ## ## ## ##" //France
                         phoneNoFormat["+39"] = "+## ## ########" //Italy
                         phoneNoFormat["+392"] = "+## #### #####" //Italy
                         phoneNoFormat["+393"] = "+## ### #######" //Italy
                
                         phoneNoFormat["+44"] = "+## #### ######" //United Kingdom
                         phoneNoFormat["+442"] = "+## ## #### #####" //United Kingdom London
                
                         phoneNoFormat["+51"] = "+## # ### ####" //Peru
                         phoneNoFormat["+519"] = "+## ### ### ###" //Peru Mobile
                         phoneNoFormat["+54"] = "+## ### ### ####" //Argentina
                         phoneNoFormat["+541"] = "+## ## #### ####" //Argentina
                         phoneNoFormat["+549"] = "+## # ### ### ####" //Argentina
                         phoneNoFormat["+55"] = "+## (##) ####-####" //Brazil
                         phoneNoFormat["+551"] = "+## (##) ####-###" //Brazil Mobile?
                
                         phoneNoFormat["+60"] = "+## # #### ####" //Malaysia
                         phoneNoFormat["+6012"] = "+## ## ### ####" //Malaysia Mobile
                         phoneNoFormat["+607"] = "+## # ### ####" //Malaysia?
                         phoneNoFormat["+61"] = "+## # #### ####" //Australia
                         phoneNoFormat["+614"] = "+## ### ### ###" //Australia Mobile
                         phoneNoFormat["+62"] = "+## ## #######" //Indonesia
                         phoneNoFormat["+628"] = "+## ### ######" //Indonesia Mobile
                         phoneNoFormat["+65"] = "+## #### ####" //Singapore
                
                         phoneNoFormat["+90"] = "+## (###) ### ## ##" //Turkey
                     }
                 }
                
                 func getDiallingCode(phoneNo: String) -> String
                 {
                     var countryCode = phoneNo
                     while countryCode.characters.count > 0 && phoneNoFormat[countryCode] == nil
                     {
                         countryCode = String(countryCode.characters.dropLast())
                     }
                     if countryCode == "0"
                     {
                         return localCountryCode!
                     }
                     return countryCode
                 }
                
                
                 func formatInternationalPhoneNo(fullPhoneNo: String, localisePhoneNo: Bool = true) -> String
                 {
                     if fullPhoneNo == ""
                     {
                         return ""
                     }
                     initInternationalPhoneFormats()
                
                     let diallingCode = getDiallingCode(fullPhoneNo)
                
                     let localPhoneNo = fullPhoneNo.stringByReplacingOccurrencesOfString(diallingCode, withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
                
                     var filteredPhoneNo = (localPhoneNo.characters.filter{["0","1","2","3","4","5","6","7","8","9"].contains($0)})
                     if filteredPhoneNo[0] == "0"
                     {
                         filteredPhoneNo.removeFirst()
                     }
                
                     let phoneNo:String = diallingCode + String(filteredPhoneNo)
                
                     if let format = phoneNoFormat[diallingCode]
                     {
                         let formatLength = format.characters.count
                         var formattedPhoneNo = [Character]()
                         var formatPos = 0
                         for char in phoneNo.characters
                         {
                             while formatPos < formatLength && format[formatPos] != "#" && format[formatPos] != "+"
                             {
                                 formattedPhoneNo.append(format[formatPos])
                                 formatPos++
                             }
                
                             if formatPos < formatLength
                             {
                                 formattedPhoneNo.append(char)
                                 formatPos++
                             }
                             else
                             {
                                 break
                             }
                         }
                         if localisePhoneNo,
                             let localCode = localCountryCode
                         {
                             return String(formattedPhoneNo).stringByReplacingOccurrencesOfString(localCode + " ", withString: "0", options: NSStringCompareOptions.LiteralSearch, range: nil) //US users need to remove the extra 0
                         }
                         return String(formattedPhoneNo)
                     }
                     return String(filteredPhoneNo)
                 }
                

                【讨论】:

                  【解决方案12】:

                  您可以添加电话号码,例如 000-000-0000(10 位)。 请参考此代码。

                  - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
                  {
                      if (textField==Phone_TXT)
                      {
                          if (range.location == 12)
                          {
                              return NO;
                          }
                  
                          // Backspace
                          if ([string length] == 0)
                              return YES;
                  
                          if ((range.location == 3) || (range.location == 7))
                          {
                  
                              NSString *str    = [NSString stringWithFormat:@"%@-",textField.text];
                              textField.text   = str;
                          }
                  
                          return YES;
                      }
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    我对 +X (XXX) XXX-XXXX 格式的解决方案。 (SWIFT)

                    func textFieldDidBeginEditing(textField: UITextField) {
                        if (textField == self.mobileField) {
                            textField.text = "+"
                        }
                    }
                    
                    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
                        if (textField == self.mobileField) {
                            let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
                    
                            if (newString.characters.count < textField.text?.characters.count && newString.characters.count >= 1) {
                                return true                                                         // return true for backspace to work
                            } else if (newString.characters.count < 1) {
                                return false;                        // deleting "+" makes no sence
                            }
                            if (newString.characters.count > 17 ) {
                               return false;
                            }
                    
                            let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
                    
                            let decimalString = components.joinWithSeparator("") as NSString
                            let length = decimalString.length
                    
                            var index = 0
                            let formattedString = NSMutableString()
                            formattedString.appendString("+")
                    
                            if (length >= 1) {
                                let countryCode = decimalString.substringWithRange(NSMakeRange(0, 1))
                                formattedString.appendString(countryCode)
                                index += 1
                            }
                    
                            if (length > 1) {
                                var rangeLength = 3
                                if (length < 4) {
                                    rangeLength = length - 1
                                }
                                let operatorCode = decimalString.substringWithRange(NSMakeRange(1, rangeLength))
                                formattedString.appendFormat(" (%@) ", operatorCode)
                                index += operatorCode.characters.count
                            }
                    
                            if (length > 4) {
                                var rangeLength = 3
                                if (length < 7) {
                                    rangeLength = length - 4
                                }
                                let prefix = decimalString.substringWithRange(NSMakeRange(4, rangeLength))
                                formattedString.appendFormat("%@-", prefix)
                                index += prefix.characters.count
                            }
                    
                            if (index < length) {
                                let remainder = decimalString.substringFromIndex(index)
                                formattedString.appendString(remainder)
                            }
                    
                            textField.text = formattedString as String
                    
                            if (newString.characters.count == 17) {
                                textField.resignFirstResponder()
                            }
                    
                            return false
                        }
                    
                        return true
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      Swift 5+

                      它是@Дарія Прокопович 答案的更新版本。

                      extension String {
                        func applyPatternOnNumbers(pattern:String = "+# (###) ###-####", replacmentCharacter:Character = "#") -> String {
                              var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
                              for index in 0 ..< pattern.count {
                                  guard index < pureNumber.count else { return pureNumber }
                                  let stringIndex = String.Index(encodedOffset: index)
                                  let patternCharacter = pattern[stringIndex]
                                  guard patternCharacter != replacmentCharacter else { continue }
                                  pureNumber.insert(patternCharacter, at: stringIndex)
                              }
                              return pureNumber
                          }
                      }
                      

                      用法:

                       @IBAction func phoneTextFieldValueChanged(_ sender: Any) {
                            phoneTextField.text = phoneTextField.text!.applyPatternOnNumbers()
                       }
                      

                      【讨论】:

                        【解决方案15】:

                        你可以使用这个库https://github.com/luximetr/AnyFormatKit

                        例子

                        let textInputController = TextInputController()
                        
                        let textInput = TextInputField() // or TextInputView or any TextInput
                        textInputController.textInput = textInput // setting textInput
                        
                        let formatter = TextInputFormatter(textPattern: "### (###) ###-##-##", prefix: "+12")
                        textInputController.formatter = formatter // setting formatter
                        

                        只需将您的 textField 设置为此 textInputController,它就会使用您设置的模式格式化文本。

                        或者

                        let phoneFormatter = TextFormatter(textPattern: "### (###) ###-##-##")
                        phoneFormatter.formattedText(from: "+123456789012") // +12 (345) 678-90-12
                        

                        用于格式化完整字符串

                        【讨论】:

                          【解决方案16】:

                          不幸的是,你必须自己做。联系人应用程序使用未记录的 API。由于某种原因,将输入格式化程序附加到文本字段并没有像在 Mac 上那样在 iPhone 上公开。随时提交功能增强错误报告。

                          【讨论】:

                            【解决方案17】:

                            希望我要说的内容对像我一样在 iOS 上编程的新手有所帮助。我做了 zingle-dingle 的建议(非常感谢!)。为了帮助新的代码加上我将列出的内容可以帮助你。 1.你必须在头文件上添加 UITextFieldDelegate 。 2. UITextField 应该将委托与视图绑定,在我的例子中是 UIViewController,它是头文件。 3. UITextField 应该是 instatiated,这意味着,yourtextfile.delegate = self,在“.m”文件上。

                            【讨论】:

                              【解决方案18】:

                              https://github.com/chebur/CHRTextFieldFormatter 对我来说就像一个魅力。

                              从使用页面复制/粘贴:

                              - (void)viewDidLoad {
                                  [super viewDidLoad];
                                  self.phoneNumberFormatter = [[CHRTextFieldFormatter alloc] initWithTextField:self.phoneNumberTextField mask:[CHRPhoneNumberMask new]];
                                  self.cardNumberFormatter = [[CHRTextFieldFormatter alloc] initWithTextField:self.cardNumberTextField mask:[CHRCardNumberMask new]];
                              }
                              
                              - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
                                  if (textField == self.phoneNumberTextField) {
                                      return [self.phoneNumberFormatter textField:textField shouldChangeCharactersInRange:range replacementString:string];
                                  } else if (textField == self.cardNumberTextField) {
                                      return [self.cardNumberFormatter textField:textField shouldChangeCharactersInRange:range replacementString:string];
                                  } else {
                                      return YES;
                                  }
                              }
                              

                              也很快:

                              override func viewDidLoad() {
                                  super.viewDidLoad()
                                  self.phoneNumber.delegate = self
                                  self.phoneNumberFormatter = CHRTextFieldFormatter(textField: self.phoneNumber, mask:CHRPhoneNumberMask())
                              }
                              
                              func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
                                  if textField == self.phoneNumber {
                                      return self.phoneNumberFormatter.textField(textField, shouldChangeCharactersInRange: range, replacementString: string)
                                  }
                                  return true
                              }
                              

                              【讨论】:

                                【解决方案19】:

                                这是我对 05xx xxx xxxx 电话格式的解决方案。一开始我设置了

                                phoneTextField.delegate = self
                                phoneTextField.text = "05" // I don't let user to change it.
                                

                                它还涵盖了光标位置的复制/粘贴情况。

                                也许它对不同格式的人有帮助。

                                func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                                
                                    if range.location == 0 || range.location == 1 {
                                        return false
                                    }
                                
                                    var phone = (textField.text! as NSString).replacingCharacters(in: range, with: string)
                                
                                    if phone.length > 13 {
                                        return false
                                    }
                                
                                    phone = phone.replacingOccurrences(of: " ", with: "")
                                    if phone.characters.count > 7 {
                                        phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 4))
                                        phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 8))
                                    } else if phone.characters.count > 4 {
                                        phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 4))
                                    }
                                
                                    let text = textField.text
                                    let stringToStart = text?.substring(to: (text?.index((text?.startIndex)!, offsetBy: range.location))!)
                                
                                    let stringToStartCount = ((stringToStart?.components(separatedBy: " ").count)! > 1) ? (stringToStart?.components(separatedBy: " ").count)!-1 : 0
                                
                                    var cursorIndex = range.location + string.length - stringToStartCount
                                
                                    if cursorIndex > 7 {
                                        cursorIndex += 2
                                    } else if cursorIndex > 4 {
                                        cursorIndex += 1
                                    }
                                
                                    textField.text = phone
                                    textField.selectedTextRange = textField.textRange(from: textField.position(from: textField.beginningOfDocument, offset: cursorIndex)!, to: textField.position(from: textField.beginningOfDocument, offset: cursorIndex)!)
                                
                                    return false
                                }
                                

                                【讨论】:

                                  【解决方案20】:

                                  更新了 Swift 3 的“iOS 单元”答案,格式为 +X(XXX)XXX-XXXX:

                                  func textFieldDidBeginEditing(_ textField: UITextField) {
                                          if (textField == self.phoneTextField) {
                                              textField.text = "+"
                                          }
                                      }
                                  
                                      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                                          if (textField == self.phoneTextField) {
                                              let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
                                  
                                              if (newString.characters.count < (textField.text?.characters.count)! && newString.characters.count >= 1) {
                                                  return true                                                         // return true for backspace to work
                                              } else if (newString.characters.count < 1) {
                                                  return false;                        // deleting "+" makes no sence
                                              }
                                              if (newString.characters.count > 17 ) {
                                                  return false;
                                              }
                                  
                                              let components = newString.components(separatedBy: CharacterSet.decimalDigits.inverted)
                                              let decimalString = components.joined(separator: "") as NSString
                                              let length = decimalString.length
                                  
                                              var index = 0
                                              let formattedString = NSMutableString()
                                              formattedString.append("+")
                                  
                                              if (length >= 1) {
                                                  let countryCode = decimalString.substring(with: NSMakeRange(0, 1))
                                                  formattedString.append(countryCode)
                                                  index += 1
                                              }
                                  
                                              if (length > 1) {
                                                  var rangeLength = 3
                                                  if (length < 4) {
                                                      rangeLength = length - 1
                                                  }
                                                  let operatorCode = decimalString.substring(with: NSMakeRange(1, rangeLength))
                                                  formattedString.appendFormat(" (%@) ", operatorCode)
                                                  index += operatorCode.characters.count
                                              }
                                  
                                              if (length > 4) {
                                                  var rangeLength = 3
                                                  if (length < 7) {
                                                      rangeLength = length - 4
                                                  }
                                                  let prefix = decimalString.substring(with: NSMakeRange(4, rangeLength))
                                                  formattedString.appendFormat("%@-", prefix)
                                                  index += prefix.characters.count
                                              }
                                  
                                              if (index < length) {
                                                  let remainder = decimalString.substring(from: index)
                                                  formattedString.append(remainder)
                                              }
                                  
                                              textField.text = formattedString as String
                                  
                                              if (newString.characters.count == 17) {
                                                  textField.resignFirstResponder()
                                              }
                                  
                                              return false
                                          }
                                  
                                          return true
                                      }
                                  

                                  【讨论】:

                                    【解决方案21】:

                                    您必须手动执行此操作。获取 textField 通知并检查字段文本的长度并根据国家/地区对其进行格式化。 如果有任何问题,请告诉我。我已经这样做了

                                    【讨论】:

                                    • 嘿goeff,如果你能给我看代码来做这件事,那就太棒了,因为我刚开始用objective-c编码,这让我很困惑。提前致谢!
                                    【解决方案22】:

                                    我有一个解决方案,但它有一些缺点,看看你是否可以修改和使用它。通过使用它,您可以实现将电话号码限制为 10 位并按照美国格式对其进行格式化。

                                    #define MAX_LENGTH 10
                                    

                                    在 UITextField Delegate 方法中实现

                                    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
                                    
                                    {
                                    
                                     NSInteger insertDelta = string.length - range.length;
                                    
                                    if (PhoneNumber_txt.text.length + insertDelta > MAX_LENGTH)
                                    {
                                        return NO; // the new string would be longer than MAX_LENGTH
                                    }
                                    else {
                                    
                                        range.length = 3;
                                        range.location = 3;
                                    
                                        PhoneNumber_txt.text = [NSString stringWithFormat:@"(%@)%@-%@", [PhoneNumber_txt.text substringToIndex:3], [PhoneNumber_txt.text substringWithRange:range], [PhoneNumber_txt.text substringFromIndex:6]];
                                        return YES;
                                    }
                                     }
                                    

                                    【讨论】:

                                      【解决方案23】:
                                      - (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
                                      
                                      NSCharacterSet* validationSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
                                      NSArray* components = [string componentsSeparatedByCharactersInSet:validationSet];
                                      
                                      if ([components count] > 1) {
                                          return NO;
                                      }
                                      
                                      NSString* newString = [textField.text stringByReplacingCharactersInRange:range
                                                                                                       withString:string];
                                      
                                      NSArray* validComponents = [newString componentsSeparatedByCharactersInSet:validationSet];
                                      
                                      static const int localNumberMaxLength = 7;
                                      static const int areaCodeMaxLength = 3;
                                      static const int countryCodeMaxLength = 2;
                                      
                                      newString = [validComponents componentsJoinedByString:@""];
                                      
                                      if ([newString length] > localNumberMaxLength + areaCodeMaxLength + countryCodeMaxLength) {
                                          return NO;
                                      }
                                      
                                      
                                      NSLog(@"new string: %@", newString);
                                      
                                      NSMutableString* resultString = [NSMutableString string];
                                      
                                      NSInteger localNumberLength = MIN([newString length], localNumberMaxLength);
                                      
                                      if (localNumberLength > 0) {
                                          NSString* number = [newString substringFromIndex:(int)[newString length] - localNumberLength];
                                          [resultString appendString:number];
                                      
                                          if ([resultString length] > 3) {
                                              [resultString insertString:@"-" atIndex:3];
                                          }
                                      }
                                      
                                      if ([newString length] > localNumberMaxLength) {
                                          NSInteger areaCodeLength = MIN((int)[newString length] - localNumberMaxLength, areaCodeMaxLength);
                                          NSRange areaRange = NSMakeRange((int)[newString length] - localNumberMaxLength - areaCodeLength, areaCodeLength);
                                          NSString* area = [newString substringWithRange:areaRange];
                                      
                                          area = [NSString stringWithFormat:@"(%@) ",area];
                                      
                                          [resultString insertString:area atIndex:0];
                                      }
                                      
                                      if ([newString length] > localNumberMaxLength + areaCodeMaxLength) {
                                          NSInteger countryCodeLength = MIN((int)[newString length] - localNumberMaxLength - areaCodeMaxLength, countryCodeMaxLength);
                                          NSRange countryCodeRange = NSMakeRange(0, countryCodeLength);
                                          NSString* countryCode = [newString substringWithRange:countryCodeRange];
                                      
                                          countryCode = [NSString stringWithFormat:@"+%@ ",countryCode];
                                      
                                          [resultString insertString:countryCode atIndex:0];
                                      }
                                      
                                      textField.text = resultString;
                                      return NO;    
                                      

                                      }

                                      【讨论】:

                                      • 这个问题已经有几个答案,其中一些得到了很多赞。你至少应该解释为什么你认为你的答案增加了一些新的东西。
                                      【解决方案24】:

                                      这是我使用 Swift 4 格式化多个类型 (123) 689-0987 的解决方案

                                      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                                          guard let currentText:String = textField.text else {return true}
                                          if string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) != nil { return false }
                                          let newCount:Int = currentText.count + string.count - range.length
                                          let addingCharacter:Bool = range.length <= 0
                                      
                                          if(newCount == 1){
                                              textField.text = addingCharacter ? currentText + "(\(string)" : String(currentText.dropLast(2))
                                              return false
                                          }else if(newCount == 5){
                                              textField.text = addingCharacter ? currentText + ") \(string)" : String(currentText.dropLast(2))
                                              return false
                                          }else if(newCount == 10){
                                              textField.text = addingCharacter ? currentText + "-\(string)" : String(currentText.dropLast(2))
                                              return false
                                          }
                                      
                                          if(newCount > 14){
                                              return false
                                          }
                                      
                                          return true
                                      }
                                      

                                      【讨论】:

                                      • 仅供参考,这打破了自动建议的使用。非常适合打字。
                                      【解决方案25】:

                                      我使用这种格式 X (XXX) XXX XX XX 它在土耳其有效,

                                      我将它与 TableViewSwift 4

                                      一起使用
                                      func formatToPhoneNumber(withPhoneTextField: UITextField, tableTextField: UITextField, range: NSRange, string: String) -> Bool {
                                      
                                          if (tableTextField == withPhoneTextField) {
                                      
                                              let newString = (tableTextField.text! as NSString).replacingCharacters(in: range, with: string)
                                              let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
                                      
                                              let decimalString = components.joined(separator: "") as NSString
                                              let length = decimalString.length
                                              let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar)
                                      
                                              if length == 0 || (length > 11 && !hasLeadingOne) || length > 12 {
                                                  let newLength = (tableTextField.text! as NSString).length + (string as NSString).length - range.length as Int
                                      
                                                  return (newLength > 11) ? false : true
                                              }
                                      
                                              var index = 0 as Int
                                              let formattedString = NSMutableString()
                                      
                                              if hasLeadingOne {
                                                  formattedString.append("1 ")
                                                  index += 1
                                              }
                                      
                                              if (length - index) > 1{
                                                  let zeroNumber = decimalString.substring(with: NSMakeRange(index, 1))
                                                  formattedString.appendFormat("%@ ", zeroNumber)
                                                  index += 1
                                              }
                                      
                                              if (length - index) > 3 {
                                                  let areaCode = decimalString.substring(with: NSMakeRange(index, 3))
                                                  formattedString.appendFormat("(%@) ", areaCode)
                                                  index += 3
                                              }
                                      
                                              if length - index > 3 {
                                                  let prefix = decimalString.substring(with: NSMakeRange(index, 3))
                                                  formattedString.appendFormat("%@ ", prefix)
                                                  index += 3
                                              }
                                      
                                              if (length - index) > 3{
                                                  let prefix = decimalString.substring(with: NSMakeRange(index, 2))
                                                  formattedString.appendFormat("%@ ", prefix)
                                                  index += 2
                                              }
                                      
                                              let remainder = decimalString.substring(from: index)
                                              formattedString.append(remainder)
                                              tableTextField.text = formattedString as String
                                      
                                              return false
                                          } else {
                                              return true
                                          }
                                      }
                                      

                                      你可以在

                                      中调用这个函数
                                      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String, indexPath: IndexPath) -> Bool {
                                      
                                      }
                                      

                                      在您的文本字段所在的任何 indexPath 中

                                      例如我在 indexPath 编号 1 中的文本字段,所以代码将是

                                      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String, indexPath: IndexPath) -> Bool {
                                      
                                          if indexPath.row == 1 {
                                      
                                              let phoneTextField = textField
                                      
                                              return formatToPhoneNumber(withPhoneTextField: phoneTextField, tableTextField: textField, range: range, string: string)
                                      
                                          }
                                      }
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2016-04-15
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多