2016-03-16 56 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