最近趁着放假時間,在看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 }