使用 UITextField 提供的 Delegate 來驗證欄位
UITextField 提供了 textField(_:shouldChangeCharactersIn:replacementString:) Delegate 讓開發者用來驗證是否要改變欄位裡的文字,不管你是直接輸入、複製貼上都逃不過它的法眼。法蘭克今天就實作四個例子供大家參考。
- 不能輸入空白
- 不能輸入中文字
- 將使用者輸入或是複製貼上的字串第一個字元轉大寫
- 文字總長度必須小於等於 10
▼在專案的進入點 AppDelegate.swift 設定第一個載入的 UIViewController.swift
▼UIViewController 必須實作 UITextFieldDelegate,如此在輸入時才會觸發事件
class ViewController: UIViewController, UITextFieldDelegate {}
▼在 UIViewController.swift 下的 viewDidLoad 生成身份證號、身份證輸入框、註冊 Tab 事件(點選瑩幕任一處可關閉瑩幕小鍵盤)
▼extension String 以用來驗證、截取字串
▼實作關閉瑩幕小鍵盤、當按下右下角的 return 鍵關閉瑩幕小鍵盤、設定欄位是否可以清除等 Delegate
▼說明只要在 UITextField 輸入字元即會觸發的 Delegate
進入今天的重頭戲,在先前提到的不能輸入空白、不能輸入中文等等相關的驗證即是要放在這個 Delegate 裡。這個 Delegate 有三個參數如下,讓法蘭克逐一來說明它們的功能所在:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {}
textField => textField.text 可取得輸入框的值
range => range.location 可取得從第幾個字元開始輸入或複製貼上的 index
string => 可取得當下輸入或複製貼上的字串
這樣描述大家或許還不清楚,法蘭克就來舉個例子讓大家看看。
首先在畫面上依序輸入 Abcd 四個字元,並在 console 印出以下訊息:
print(“textField.text: \(textField.text!)”)print(“range: \(range.location)”)print(“string: \(string)”)
console 會呈現如下:
▼實作只要在 UITextField 輸入字元即會觸發的 Delegate
該 Delegate 若是回傳 true 則會在輸入元件內顯示輸入或複製貼上的字串;相反的若是回傳 false 則不會顯示。
不能輸入空白、不能輸入、是否含有特殊字元 => 即使用剛剛 extension 的 func 判斷
第一個字轉大寫 => 若是從第一個字元開始輸入或是複製貼上則將第一個字元轉大寫,其它字元轉小寫。(要排除注音符號)
長度必須小於等於10 => 已存在的字數 - 被取代的字數 + 輸入的字數
Apple 提供的這三個參數已足以用來檢核大部份的邏輯,大家在設計 Delegate 時,不彷也可以參考 Apple 的設計思維。
該專案已放置 GitHub,連結如下: