Saya sudah mencari-cari ini tapi sepertinya saya tidak bisa menemukannya. Saya tahu cara menghapus keyboard menggunakan Objective-C
tetapi saya tidak tahu bagaimana melakukannya dengan menggunakan Swift
? Apakah ada yang tahu?
Saya sudah mencari-cari ini tapi sepertinya saya tidak bisa menemukannya. Saya tahu cara menghapus keyboard menggunakan Objective-C
tetapi saya tidak tahu bagaimana melakukannya dengan menggunakan Swift
? Apakah ada yang tahu?
Jawaban:
override func viewDidLoad() {
super.viewDidLoad()
//Looks for single or multiple taps.
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
//Uncomment the line below if you want the tap not not interfere and cancel other interactions.
//tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}
Berikut adalah cara lain untuk melakukan tugas ini jika Anda akan menggunakan fungsi ini secara berganda UIViewControllers
:
// Put this piece of code anywhere you like
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Sekarang di setiap UIViewController
, yang harus Anda lakukan adalah memanggil fungsi ini:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Fungsi ini dimasukkan sebagai fungsi standar dalam repo saya yang berisi banyak Ekstensi Swift yang bermanfaat seperti ini, periksa: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. Setidaknya itu menyelesaikannya untuk saya. Semoga ini bisa membantu seseorang
Jawaban atas pertanyaan Anda tentang cara mengabaikan keyboard di Xcode 6.1 menggunakan Swift di bawah ini:
import UIKit
class ItemViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textFieldItemName: UITextField!
@IBOutlet var textFieldQt: UITextField!
@IBOutlet var textFieldMoreInfo: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textFieldItemName.delegate = self
textFieldQt.delegate = self
textFieldMoreInfo.delegate = self
}
...
/**
* Called when 'return' key pressed. return NO to ignore.
*/
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
/**
* Called when the user click on the view (outside the UITextField).
*/
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
}
( Sumber informasi ini ).
Buat ekstensi seperti di bawah ini & panggil hideKeyboardWhenTappedAround()
di pengontrol tampilan Base Anda.
//
// UIViewController+Extension.swift
// Project Name
//
// Created by ABC on 2/3/18.
// Copyright © 2018 ABC. All rights reserved.
//
import UIKit
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tapGesture = UITapGestureRecognizer(target: self,
action: #selector(hideKeyboard))
view.addGestureRecognizer(tapGesture)
}
@objc func hideKeyboard() {
view.endEditing(true)
}
}
Paling penting untuk memanggil di Base View Controller Anda sehingga tidak perlu menelepon sepanjang waktu di semua pengontrol tampilan.
Anda bisa menelepon
resignFirstResponder()
pada instance UIResponder, seperti UITextField. Jika Anda menyebutnya pada tampilan yang saat ini menyebabkan keyboard ditampilkan, maka keyboard tersebut akan diberhentikan.
//Simple exercise to demonstrate, assuming the view controller has a //Textfield, Button and a Label. And that the label should display the //userinputs when button clicked. And if you want the keyboard to disappear //when clicken anywhere on the screen + upon clicking Return key in the //keyboard. Dont forget to add "UITextFieldDelegate" and
//"self.userInput.delegate = self" as below
import UIKit
class ViewController: UIViewController,UITextFieldDelegate {
@IBOutlet weak var userInput: UITextField!
@IBAction func transferBtn(sender: AnyObject) {
display.text = userInput.text
}
@IBOutlet weak var display: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//This is important for the textFieldShouldReturn function, conforming to textfieldDelegate and setting it to self
self.userInput.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//This is for the keyboard to GO AWAYY !! when user clicks anywhere on the view
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
//This is for the keyboard to GO AWAYY !! when user clicks "Return" key on the keyboard
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
untuk Swift 3 sangat sederhana
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
jika Anda ingin menyembunyikan keyboard saat menekan tombol RETURN
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
tetapi dalam kasus kedua Anda juga harus meneruskan delegasi dari semua textFields ke ViewController di Main.Storyboard
unrecognized selector sent to instance
dengan kode ini.
Swift 3: Cara termudah untuk mengabaikan keyboard:
//Dismiss keyboard method
func keyboardDismiss() {
textField.resignFirstResponder()
}
//ADD Gesture Recignizer to Dismiss keyboard then view tapped
@IBAction func viewTapped(_ sender: AnyObject) {
keyboardDismiss()
}
//Dismiss keyboard using Return Key (Done) Button
//Do not forgot to add protocol UITextFieldDelegate
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
keyboardDismiss()
return true
}
Jawaban Dash benar dan disukai. Pendekatan yang lebih "bumi hangus" adalah menelepon view.endEditing(true)
. Ini menyebabkan view
dan semua subview untuk resignFirstResponder
. Jika Anda tidak memiliki referensi ke tampilan yang ingin Anda abaikan, ini adalah solusi yang retas namun efektif.
Perhatikan bahwa secara pribadi saya pikir Anda harus memiliki referensi ke tampilan yang Anda ingin mengundurkan diri sebagai responden pertama.
.endEditing(force: Bool)
adalah pendekatan biadab; tolong jangan gunakan itu.
Swift 5 hanya dua baris sudah cukup. Tambahkan ke Anda viewDidLoad
harus bekerja.
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
Jika gerakan ketuk Anda memblokir beberapa sentuhan lain, maka tambahkan baris ini:
tapGesture.cancelsTouchesInView = false
Di storyboard:
Swift 3:
Ekstensi dengan Selector
sebagai parameter untuk dapat melakukan hal-hal tambahan dalam fungsi pemberhentian dan cancelsTouchesInView
untuk mencegah distorsi dengan sentuhan pada elemen lain dari tampilan.
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
Pemakaian:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
Gunakan IQKeyboardmanager yang akan membantu Anda menyelesaikan dengan mudah .....
/////////////////////////////////////////
! [cara menonaktifkan keyboard ..] [1]
import UIKit
class ViewController: UIViewController,UITextFieldDelegate {
@IBOutlet weak var username: UITextField!
@IBOutlet weak var password: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
username.delegate = self
password.delegate = self
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
textField.resignFirstResponder()
return true;
}
override func touchesBegan(_: Set<UITouch>, with: UIEvent?) {
username.resignFirstResponder()
password.resignFirstResponder()
self.view.endEditing(true)
}
}
Saya menemukan solusi terbaik termasuk jawaban yang diterima dari @Esqarrouth, dengan beberapa penyesuaian:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboardView() {
view.endEditing(true)
}
}
Baris tap.cancelsTouchesInView = false
sangat penting: memastikan bahwa UITapGestureRecognizer
elemen-elemen lain pada tampilan tidak mencegah interaksi pengguna.
Metode dismissKeyboard()
itu diubah menjadi sedikit kurang elegan dismissKeyboardView()
. Ini karena dalam basis kode proyek saya yang cukup lama, ada beberapa kali di mana dismissKeyboard()
sudah digunakan (saya bayangkan ini tidak biasa), menyebabkan masalah kompiler.
Kemudian, seperti di atas, perilaku ini dapat diaktifkan di Pengontrol Tampilan individual:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Di Swift 4, tambahkan @objc:
Di viewDidLoad:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Fungsi:
@objc func dismissKeyboard() {
view.endEditing(true)
}
Tambahkan ekstensi ini ke ViewController Anda:
extension UIViewController {
// Ends editing view when touches to view
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
self.view.endEditing(true)
}
}
Untuk memperluas jawaban Esqarrouth , saya selalu menggunakan yang berikut ini untuk mengabaikan keyboard, terutama jika kelas dari mana saya menolak keyboard tidak memiliki view
properti dan / atau bukan subkelas dariUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
Dan, untuk kenyamanan, ekstensi berikut ke UIApplcation
kelas:
extension UIApplication {
/// Dismisses the keyboard from the key window of the
/// shared application instance.
///
/// - Parameters:
/// - force: specify `true` to force first responder to resign.
open class func endEditing(_ force: Bool = false) {
shared.endEditing(force)
}
/// Dismisses the keyboard from the key window of this
/// application instance.
///
/// - Parameters:
/// - force: specify `true` to force first responder to resign.
open func endEditing(_ force: Bool = false) {
keyWindow?.endEditing(force)
}
}
import UIKit
class ItemViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var nameTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.nameTextField.delegate = self
}
// Called when 'return' key pressed. return NO to ignore.
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
// Called when the user click on the view (outside the UITextField).
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
}
Sebagai seorang programmer pemula dapat membingungkan ketika orang menghasilkan tanggapan yang lebih terampil dan tidak perlu ... Anda tidak perlu melakukan hal-hal rumit yang ditunjukkan di atas! ...
Berikut adalah pilihan paling sederhana ... Jika keyboard Anda muncul sebagai respons terhadap bidang teks - Di dalam fungsi layar sentuh Anda, tambahkan saja fungsi resignFirstResponder . Seperti yang ditunjukkan di bawah ini - keyboard akan ditutup karena Responder Pertama dilepaskan (keluar dari rantai Responder) ...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
Saya telah menggunakan IQKeyBoardManagerSwift untuk keyboard. mudah digunakan. cukup Tambahkan pod 'IQKeyboardManagerSwift'
Impor IQKeyboardManagerSwift dan tulis kode didFinishLaunchingWithOptions
di AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
Dengan cepat Anda bisa menggunakannya
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
Untuk Swift3
Daftarkan recogniser acara di viewDidLoad
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
maka kita perlu menambahkan gerakan ke tampilan dalam viewDidLoad yang sama.
self.view.addGestureRecognizer(tap)
Maka kita perlu menginisialisasi metode yang terdaftar
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
Posting sebagai jawaban baru karena edit saya pada jawaban @ King-Wizard ditolak.
Jadikan kelas Anda sebagai delegasi dari UITextField dan ganti sentuhanBegan.
Cepat 4
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
//Called when 'return' key is pressed. Return false to keep the keyboard visible.
func textFieldShouldReturn(textField: UITextField) -> Bool {
return true
}
// Called when the user clicks on the view (outside of UITextField).
override func touchesBegan(touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
Anda juga dapat menambahkan pengenal isyarat ketuk untuk mengundurkan diri keyboard. : D
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let recognizer = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
backgroundView.addGestureRecognizer(recognizer)
}
func handleTap(recognizer: UITapGestureRecognizer) {
textField.resignFirstResponder()
textFieldtwo.resignFirstResponder()
textFieldthree.resignFirstResponder()
println("tappped")
}
Kemungkinan lain adalah dengan menambahkan tombol besar tanpa konten yang ada di bawah semua tampilan yang perlu Anda sentuh. Berikan tindakan bernama:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
Masalah dengan pengenal isyarat bagi saya, itu juga menangkap semua sentuhan yang ingin saya terima oleh tableViewCells.
Jika Anda memiliki pandangan lain yang harus menerima sentuhan juga Anda harus mengatur
cancelsTouchesInView = false
Seperti ini:
let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
elsewhereTap.cancelsTouchesInView = false
self.view.addGestureRecognizer(elsewhereTap)
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
view.endEditing(true)
}
Coba ini, Ini Bekerja
Untuk mengikuti rekomendasi @ modocache untuk menghindari panggilanview.endEditing()
, Anda dapat melacak bidang teks yang menjadi responden pertama, tetapi itu berantakan dan rentan kesalahan.
Alternatifnya adalah memanggil resignFirstResponder()
semua bidang teks di viewcontroller . Berikut adalah contoh membuat koleksi semua bidang teks (yang dalam kasus saya diperlukan untuk kode validasi):
@IBOutlet weak var firstName: UITextField!
@IBOutlet weak var lastName: UITextField!
@IBOutlet weak var email: UITextField!
var allTextFields: Array<UITextField>! // Forced unwrapping so it must be initialized in viewDidLoad
override func viewDidLoad()
{
super.viewDidLoad()
self.allTextFields = [self.firstName, self.lastName, self.email]
}
Dengan koleksi yang tersedia, mudah untuk mengulangi semuanya:
private func dismissKeyboard()
{
for textField in allTextFields
{
textField.resignFirstResponder()
}
}
Jadi sekarang Anda dapat memanggil dismissKeyboard()
pengenal isyarat Anda (atau di mana pun yang sesuai untuk Anda). Kekurangannya adalah Anda harus mempertahankan daftar UITextField
ketika Anda menambah atau menghapus bidang.
Komentar diterima. Jika ada masalah dengan memanggil resignFirstResponder()
kontrol yang bukan responden pertama, atau jika ada cara non-kereta yang mudah dan terjamin untuk melacak responden pertama saat ini, saya ingin mendengarnya!