2016-03-16 189 views
1

我有一个自定义的UITextField,我试图'格式化输入到电话号码'作为用户类型。我想达到什么:格式化UITextField的文本作为电话号码作为用户类型

  • 添加上的UITextField一个前缀+标志作为第一个字符,不能删除。

  • 格式二者String变量和的UITextField在电话号码很好(49 291 12345678),而不是普通的数字在(4929112345678)作为用户类型的格式的文本。


我研究发现,没有内置的方法。我还找到了一个易于使用的库,名为PhoneNumberKit,用于将输入字符串格式化为电话号码。在游乐场,它就像..

let rawNumberArray = "+4929112345678" 
let phoneNumbers = PartialFormatter().formatPartial(rawNumberArray) 

print(phoneNumbers) // "+49 291 12345678" 

裸记住,图书馆需要字符串有+的第一个字符格式正确。


我试着在我的UITextField上实现它。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
{ 
    if textField == myTextField { 
     let candidateString : NSString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) 
     let updatedTextString : NSString = PartialFormatter().formatPartial(candidateString as String) 

     self.formattedPhoneNumber(updatedTextString, textField: textField) 
    } 
    return true 
} 

func formattedPhoneNumber(updatedTextString: NSString, textField: UITextField) { 
    // textField.text = "+\(updatedTextString as String)" 
    print(updatedTextString) 
} 

如果我继续textField.text = "+\(updatedTextString as String)"评论,print(updatedTextString)打印格式良好的控制台上的字符串,但里面的UITextField的UI,它只是显示简单的,非结构化的号码,如“4929112345678”

如果我取消它,事情开始变得奇怪,UITextField在UI中开始呈现重复的字符,但控制台日志打印也变得非常奇怪。我也尝试过清空textField.text = "",但也没有工作。


我在做什么错?我错过了什么,不让它工作正常?我相信这与我有关,而不是图书馆本身。

此外,如果您有任何其他建议(或库)可以帮助我解决此问题,请分享它们。

+0

,你必须从'shouldChangeCharactersInRange'返回'FALSE'。 – rmaddy

+0

我试着将'return true'改为'return false'。有'textField.text =“+ \(updatedTextString作为字符串)”'不幸的是每次我点击'删除'时都会加上'+'符号。我的方法存在逻辑错误,但我无法弄清楚。我很感激,如果你可以添加一个答案,所以我可以尝试 – senty

回答

1

如果要更改要显示的值,应在替换文本后返回false。这里有一个例子:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if let text = textField.text { 
     print("curText: \(text) range: \(range.location)-\(range.length) string: \(string)") 

     let candidate = (text as NSString).stringByReplacingCharactersInRange(range, withString: string) 

     if(!candidate.isCorrectFormat()){ 
      textField.text = callYourFormatMethodHere(); 

      return false 
     } 

    } 

    return true 
} 

你需要实现自己的isCorrectFormat()和callYourFormatMethodHere()。

编辑:

使用您的代码:如果您更新文本字段的`经`shouldChangeCharactersInRange`功能text`

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
{ 
    if textField == myTextField { 
     let candidateString : NSString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) 
     let updatedTextString : NSString = PartialFormatter().formatPartial(candidateString as String) 

     self.formattedPhoneNumber(updatedTextString, textField: textField) 

     return false // Return false here 
    } 
    return true 
} 
+0

我不能完全理解如何使用它'PartialFormatter()。formatPartial(candidateString as String)'。它实际上做了什么?我想在开头添加一个前缀不能被删除的前缀“+”号;并将文本格式设置为电话号码格式(使用PhoneNumberKit对我来说很方便) – senty

+0

请参阅更新,您需要将isCorrectFormat()和callYourFormatMethodHere()替换为您的。 – dichen

+0

我无法完全理解你的方法,也难以实现它来测试它作为candidate.isCorrectFormat()不会让我这样做。但是从打印线来看,我可以说这是为了检测+符号并防止它被删除;我是对还是完全没有道理?所以我需要做的是检测按下的按钮是否是一个数字(不是+号),并相应地像附加到textField。是对的吗? – senty