【iOS學習筆記】UITextField中的輸入檢測——限制只能輸入數字和小數點

最近趁着放假時間,在看The Big Nerd Ranch的iOS編程,想着從新複習一遍iOS開發的基礎知識編程

因而從這一篇開始記錄一些學習過程當中遇到的小問題app

書中第四章有一個溫度轉換的app實現,總體實現並不難,而此次記錄的重點在於利用UITextFieldDelegate委託限制UITextField的輸入ide

 

UITextFieldDelegate裏面有個函數函數

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

簡單來講,就是經過這個函數處理輸入的請求,而後返回bool值,對應是否修改文本學習

書中本來的要求是限制TextField中只能輸入一個小數點,已經給出了相關實現spa

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
        let replacementTextHasDecimalSepatator = string.range(of: ".")
        if existingTextHasDecimalSeparator != nil,
            replacementTextHasDecimalSepatator != nil {
            return false
        } else {
            return true
        }

}

實現很簡單,無非就是利用了Swift中string的range方法,對已輸入的字符串和待輸入的字符串中的小數點進行查找code

後面留了一個課後題:要求使用CharacterSet實現禁止字母的輸入,我這裏直接實現了只能輸入數字和小數點的限制blog

首先初始化一個只含小數點和數字的CharacterSetci

let characterSet = CharacterSet.init(charactersIn: ".0123456789")

而後一樣是在replacementString中對characterSet中的字符進行查找,若是結果不爲空返回false開發

if string.rangeOfCharacter(from: characterSet) == nil {
            return false
}

把這些所有寫到前面的textField函數中,編譯運行會發現一個問題——刪除鍵失效了

從新認真看documentation,會發現實際上在按下刪除鍵的時候textField函數也被調用了,可是replacementString會是一個空字符串,而前面沒有考慮這個問題,就會致使刪除鍵失效

修改以後以下

if string.rangeOfCharacter(from: characterSet) == nil,
    !string.isEmpty {
    return false
}
相關文章
相關標籤/搜索