使用 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,連結如下:

--

--