昨天我們學會了用 Slider 進行滑動輸入,今天,我們要來挑戰 App 中最核心的互動方式:打字!
每天打開 App,不論是登入、搜尋、發訊息,都離不開文字輸入框(TextField)。它就像是 App 與使用者溝通的橋樑。
今天,我們不僅要學會如何建立它、即時讀取使用者輸入的內容,還要一併解決每個 iOS 新手都會遇到的魔王關卡——如何讓鍵盤消失。準備好打造更完整的互動體驗了嗎?
UITextFieldDelegate(按 Return)與 touchesBegan(點空白處)兩種收起鍵盤的方法delegate 的基本委託概念,並完成設定我們要建立一個畫面,當使用者輸入文字時,Label 會即時反映顯示輸入內容。
在初學階段,很多人會先學到這種寫法:當使用者按下 Button 後,才讓 Label 顯示輸入內容。
但這次我們要挑戰不一樣的方式:
不靠按鈕,而是每次輸入文字或刪除文字時,就自動更新畫面,達到更即時、更流暢的互動效果。
這種寫法更貼近日常 App 的使用體驗,例如搜尋欄輸入時自動跳出建議字詞、聊天室即時預覽訊息等等。
打開專案,進入 MainViewController.xib ,從元件庫中拖曳一個 TextField 與一個 Label 到畫面上:
用 Auto Layout 加上約束(例如置中、上下間距、寬高)讓元件位置固定。
建立 IBOutlet(屬性連線)
將 TextField 連接到 MainViewController.swift,命名為 txfName:
@IBOutlet weak var txfName: UITextField!
將 Label 連接到 MainViewController.swift,命名為 lbMessage:
@IBOutlet weak var lbMessage: UILabel!
建立 IBAction(事件連線)
將 TextField 拖曳到程式碼,設定如下:
Action
UITextField
Editing Changed
txfNameEditing

Editing Changed 是什麼?
簡單來說,就是當使用者在 TextField 中「每打一個字」、「每刪除一個字」,這個事件就會立刻被觸發。
在 txfNameEditing 方法中加入以下程式碼:
@IBAction func txfNameEditing(_ sender: UITextField) {
if (sender.text?.isEmpty ?? true) {
lbMessage.text = "請在下方輸入文字"
return
}
lbMessage.text = sender.text
}
程式說明
sender.text?.isEmpty ?? true:判斷是否為空或為 nil,若是則視為沒有輸入。Label 上。如果不處理,鍵盤會一直停留在畫面上。以下我們介紹兩種常見的收起方式:
方法一:按下 Return 鍵收起
讓 MainViewController.swift 支援 UITextFieldDelegate 協定,並實作收起邏輯:
extension MainViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder() // 收起鍵盤
return true
}
}
delegate(委派)?delegate 是一種「委託設計模式」,就像老闆與秘書的關係:
TextField):專注核心工作,但將「使用者按 Return」等雜事外包出去。ViewController):簽署一份工作合約 (UITextFieldDelegate),承諾會處理這些雜事。txfName.delegate = self):老闆正式指派這位秘書。之後,每當有狀況發生,TextField 就會自動通知它的 delegate 來處理。
別忘了在 viewDidLoad() 中指定委派者:
override func viewDidLoad() {
super.viewDidLoad()
txfName.delegate = self
}
方法二:點擊空白處收起
覆寫 UIViewController 的內建方法 touchesBegan,只要點畫面空白區就會收起鍵盤:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
你可以選擇在 MainViewController.xib 右側屬性欄設定 Label 預設文字,或是在程式碼中設定,例如在 viewDidLoad() 中這樣寫:
override func viewDidLoad() {
super.viewDidLoad()
txfName.delegate = self
lbMessage.text = "請在下方輸入文字"
}
模擬器預設不會跳出鍵盤,可以使用以下方式叫出:
出現鍵盤畫面:
今天我們掌握了 App 中最重要的輸入元件:輸入框(TextField)!我們不僅學會了如何建立它,更透過 Editing Changed 事件,實現了比「按按鈕」更流暢的即時文字互動。
最關鍵的是,你學會了處理鍵盤的兩種核心技巧:透過實作 UITextFieldDelegate 在按下 Return 時收起鍵盤,以及覆寫 touchesBegan 來實現點擊空白處收起。這些都是提升 App 使用者體驗的必備功能!
準備好了嗎?明天,我們要來挑戰佔據了 iOS App 半壁江山的王者級元件:列表(TableView)!
從手機裡的「設定」和「聯絡人」列表,到 Instagram 的動態牆、音樂 App 的歌曲清單,TableView 無所不在。它是呈現大量、可滑動資料的唯一正解。
明天,你將學會 TableView 的運作核心—— dataSource(資料來源)與 delegate(委派),並親手打造出你的第一個滾動列表。這是每位 iOS 開發者的必經之路,也是讓你的 App 變得專業的關鍵一步!
敬請期待 《Day 21|Xcode 列表入門:資料一覽無遺,實戰 TableView》