Để ẩn bàn phím trên màn hình, iOS SDK cung cấp các phương thức nội bộ. Bàn phím xuất hiện khi người dùng nhập liệu vào UITextField hoặc UITextView. Chúng ta cần dùng các phương thức phù hợp.
Cách 1: Ẩn bàn phím cho một Text Field cụ thể
Nếu text field hiện tại là tfOne:
tfOne.resignFirstResponder()
Gọi phương thức này trong action của button hoặc gesture recognizer.
Cách 2: Hàm chung cho nhiều Text Field/View (Khuyến nghị)
Tạo hàm extension cho UIViewController để ẩn bàn phím khi chạm ra ngoài vùng nhập liệu:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Cách sử dụng
Gọi trong viewDidLoad():
override func viewDidLoad() {
super.viewDidLoad()
hideKeyboardWhenTappedAround()
}
Khi đó, chạm bất kỳ đâu trên view (trừ text field/view) sẽ ẩn bàn phím.
Cách 3: Sử dụng UITextFieldDelegate (Cho trường hợp cần kiểm soát chi tiết)
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
// Ẩn bàn phím khi nhấn Return
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
Cách 4: Ẩn bàn phím khi scroll (UITableView/UICollectionView)
tableView.keyboardDismissMode = .onDrag // hoặc .interactive
Tóm tắt so sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| resignFirstResponder() | Đơn giản, kiểm soát chính xác | Phải tham chiếu đến từng text field |
| Extension UIViewController | Tái sử dụng, tự động cho toàn màn hình | Cần view để gắn gesture |
| UITextFieldDelegate | Kiểm soát phím Return, validation | Phải set delegate cho từng field |
| keyboardDismissMode | Tự động khi scroll table/collection | Chỉ áp dụng cho scroll view |
Lưu ý
cancelsTouchesInView = falseđảm bảo touch vẫn được truyền xuống các view conview.endEditing(true)ẩn bàn phím cho tất cả text field/text view trong view hierarchy- Trên iPad, bàn phím có thể tách (split) - code trên vẫn hoạt động bình thường