Bagaimana cara menyembunyikan keyboard dengan cepat saat menekan tombol kembali?

214

Saya menggunakan UITextfiedsaat mengklik pada keyboard textfied muncul tetapi ketika saya menekan returntombol, keyboard tidak menghilang. Saya menggunakan kode berikut:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

metode resignfirstresponder tidak berfungsi.

Ashwinkumar Mangrulkar
sumber
10
sudahkah Anda mempertimbangkan menerima jawaban RSC? menerima jawaban adalah apa yang membuat tempat ini berfungsi dan dianggap sebagai praktik yang baik.
Juan Boero
7
jika ada jawaban yang memenuhi kebutuhan Anda, harap tandai sebagai jawaban agar orang lain dapat memperoleh bantuan darinya.
Syed Md. Kamruzzaman

Jawaban:

397

Anda dapat membuat aplikasi mengabaikan keyboard menggunakan fungsi berikut

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

Berikut adalah contoh lengkap untuk menggambarkan dengan lebih baik bahwa:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

Sumber kode: http://www.snip2code.com/Snippet/85930/swift-delegate-sample

rsc
sumber
22
Saya kehilangan "self.myTextField.delegate = self;" Terima kasih!
tylerlindell
4
Saya melewatkan UITextFieldDelegate!
Cesare
1
@ kommradHomer, tanpa ragu ada hal lain yang membuat keyboard Anda tidak muncul. Jika Anda mau, letakkan kode Anda di pastebin dan tempel tautan di sini agar saya melihatnya.
rsc
1
@RSC Anda kemungkinan besar benar. Saya seorang pemula 2 hari di ios, jadi entah bagaimana menyingkirkan masalah saya dan semuanya berfungsi seperti yang Anda sarankan :)
kommradHomer
1
Jadi, bekerja untuk saya (cepat 3): func textFieldShouldReturn(textField: UITextField) -> Bool {ganti ke func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg
112

Bagian return truedari ini hanya memberi tahu bidang teks apakah diizinkan untuk kembali atau tidak.
Anda harus secara manual memberi tahu bidang teks untuk mengabaikan keyboard (atau apa pun responden pertamanya), dan ini dilakukan dengan resignFirstResponder(), seperti:

// Called on 'Return' pressed. Return false to ignore.

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
Mick MacCallum
sumber
2
terima kasih ... dalam kasus saya "metode resignFirstResponder ()" tidak mendapatkan secara otomatis dan saya pikir itu tidak mendukung tetapi saat menulis secara manual itu berfungsi dengan baik .. terima kasih yang saya cari.
Ashwinkumar Mangrulkar
@AshwinMangrulkar Anda dapat mengharapkan bahwa dalam versi beta dari fitur Xcode 6 penyelesaian otomatis dapat cacat.
Paul Brewczynski
1
dan tentu saja titik koma setelah "benar" tidak diperlukan lagi
36 By Design
1
bukankah itu persyaratan yang sesuai dengan viewController Anda UITextFieldDelegate?
Sayang
1
alih-alih self.view.endEditing () jawaban ini sesuai dan pendekatan yang benar
saigen
45
  • Tambahkan UITextFieldDelegateke deklarasi kelas:

    class ViewController: UIViewController, UITextFieldDelegate
  • Hubungkan textfieldatau tulis itu secara terprogram

    @IBOutlet weak var userText: UITextField!
  • atur view controller Anda sebagai delegasi bidang teks yang dilihat memuat:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Tambahkan fungsi berikut

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    dengan semua ini keyboard Anda akan mulai menghilang dengan menyentuh di luar bidang teks juga dengan menekan tombol kembali.

Codetard
sumber
Terima kasih sobat! Saya melewatkan ini: UITextFieldDelegate... terima kasih banyak!
Adriano Tadao
Untuk beberapa alasan, ketika saya mengatur txtField.delegate = self, saya tidak bisa mengetik dalam bidang teks itu begitu saya menjalankan aplikasi
Jesus Rodriguez
@JesusAdolfoRodriguez pasti ada alasan di balik kesalahan itu, karena kode ini tidak menyebabkan masalah. : D Selamat coding!
Codetard
Terima kasih untuk langkah demi langkah. Ini lebih bermanfaat bagi saya daripada hanya satu blok kode.
kenhkelly
1
"dengan semua ini keyboard Anda akan mulai mengabaikan dengan menyentuh di luar bidang teks" - Tidak benar. textFieldShouldReturn hanya dipanggil dengan menekan tombol kembali.
Jurasic
39

Swift 4.2 - Tidak Perlu Delegasi

Anda dapat membuat outlet tindakan dari UITextField untuk " Tindakan Utama Dipicu " dan mengundurkan diri responden pertama pada parameter pengirim yang diteruskan:

Buat Outlet Aksi

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

Sangat sederhana.

(Terima kasih untuk video 60 detik Scott Smith untuk memberi tahu saya tentang ini: https://youtu.be/v6GrnVQy7iA )

Mark Moeykens
sumber
jika kita memiliki beberapa bidang teks pada satu halaman maka apakah kita perlu melakukannya untuk setiap bidang teks ...
DragonFire
@DragonFire Anda dapat menetapkan beberapa bidang teks ke outlet yang sama. Cukup seret dari outlet Aksi Utama Dipicu di inspektur outlet (sisi kiri layar) ke IBAction dalam kode Anda
Brad Root
Baik untuk dicatat bahwa menyeret langsung dari bidang teks di storyboard akan default tindakan yang ditautkan ke Editing Did End, alih-alih Tindakan Utama Dipicu, jadi itu harus dilakukan dari Inspektur Koneksi sidebar.
Cloud
Luar biasa. Saya tidak tahu hal itu. Terima kasih.
Numan Karaaslan
Juga bekerja dengan Swift 2, jika ada yang masih peduli. Terima kasih.
siralexsir88
22

Solusi Simple Swift 3: Tambahkan fungsi ini ke pengontrol tampilan Anda yang menampilkan bidang teks:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

Kemudian buka asisten editor Anda dan pastikan kedua Main.storyboard Anda di satu sisi tampilan Anda dan file controller.swift tampilan yang diinginkan di sisi lain. Klik pada bidang teks dan kemudian pilih dari panel utilitas sisi kanan 'Tampilkan Inspektur Koneksi'. Kendalikan kontrol dari 'Did End on Exit' ke fungsi di atas dalam file cepat Anda. Ulangi untuk bidang teks lainnya di adegan itu dan tautkan ke fungsi yang sama.

elarcoiris
sumber
14

@RSC

bagi saya tambahan penting dalam Xcode Versi 6.2 (6C86e) ada di override func viewDidLoad()

 self.input.delegate = self;

Sudah mencoba membuatnya bekerja dengan kunci kembali selama berjam-jam sampai saya menemukan posting Anda, RSC. Terima kasih!

Juga, jika Anda ingin menyembunyikan keyboard jika Anda menyentuh tempat lain di layar:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }
Tobias F. Meier
sumber
12

Untuk mendapatkan pemberhentian keyboard otomatis, saya memasukkan kode ini ke dalam salah satu metode kelas bidang teks khusus saya:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

Ganti nama outlet Anda dengan textField.

jenis perdamaian
sumber
1
Luar biasa. Ini adalah pilihan terpendek dan terbaik menurut saya. Terutama saat Anda membuat bidang teks di dalam metode lain. Seperti di dalam header tampilan tabel.
kakubei
Maaf, di mana tepatnya Anda harus meletakkan ini dan apa yang harus Anda lakukan untuk menutup keyboard? Saya memasukkan mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(versi Swift 5) ke dalam viewDidLoadtetapi tidak kembali atau mengetuk suatu tempat di luar textfield bekerja. Saya mendapatkan bidang teks dengan membuat outlet masing-masing.
Neph
Saya memasukkannya ke dalam subkelas kelas khusus yang diwarisi dari UIViewController. Subkelas ini juga sesuai dengan UITextViewDelegate dan UITextFieldDelegate. Saya memasukkannya ke dalam viewDidAppearmetode kelas itu. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Ini mungkin agak terlalu spesifik untuk kasus saya, tetapi mudah-mudahan ini membantu. Coba lakukan panggilan di dalam viewDidAppeardan sesuaikan dengan delegasi jika perlu.
peacetype
10

Cara lain untuk melakukan ini yang sebagian besar menggunakan storyboard dan dengan mudah memungkinkan Anda untuk memiliki beberapa bidang teks adalah:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Hubungkan semua bidang teks Anda untuk pengontrol tampilan ke tindakan pada Did End On Exitacara setiap bidang.

James Thompson
sumber
Maaf untuk masalah itu, tapi saya mencoba metode ini di aplikasi saya dan sepertinya tidak berfungsi. Saya memiliki bidang teks di bilah navigasi dan saya menghubungkannya ke tindakan ini dengan acara itu seperti yang Anda katakan, tetapi tidak berfungsi saat runtime.
wasimsandhu
Ini akan macet jika pengirimnya adalah tipe UIBarButtonItem. Jika saya menambahkan bilah alat dengan tombol Selesai ke tombol angka maka kode Anda pasti macet dengan pemilih yang tidak dikenal dikirim ke instance log.
Jayprakash Dubey
8

Saya akan menyarankan untuk memulai Kelas dari RSC:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}

SENI LAOMUSIK
sumber
8

Saat pengguna mengetuk tombol Selesai pada papan ketik teks, acara Did End On Exit akan dihasilkan; pada saat itu, kita perlu memberi tahu bidang teks untuk menyerahkan kontrol sehingga keyboard akan hilang. Untuk melakukan itu, kita perlu menambahkan metode aksi ke kelas controller kita. Pilih ViewController.swift tambahkan metode tindakan berikut:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

Pilih Main.storyboard di Project Navigator dan buka inspektur koneksi. Seret dari lingkaran di sebelah Did End On Exit ke ikon Yellow View Controller di storyboard dan lepaskan. Menu pop-up kecil akan muncul berisi nama tindakan tunggal, yang baru saja kita tambahkan. Klik tindakan textFieldDoneEditing untuk memilihnya dan hanya itu.

Ian Seth Colin
sumber
8

Inilah pembaruan Swift 3.0 untuk komentar peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
Flyeater Darth
sumber
ini adalah jawaban bersih
po5i
Ini harus menjadi jawaban yang diterima. Bekerja pada satu percobaan.
Jaswant Singh
7

Saya benci menambahkan fungsi yang sama ke setiap UIViewController. Dengan memperluas UIViewController untuk mendukung UITextFieldDelegate, Anda dapat memberikan perilaku default "kembali ditekan".

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

Saat Anda membuat UIViewController dan UITextField baru, yang harus Anda lakukan adalah menulis satu kode baris di UIViewController Anda.

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Anda bahkan dapat menghilangkan kode satu baris ini dengan mengaitkan delegasi di Main.storyboard. (Menggunakan "ctrl" dan seret dari UITextField ke UIViewController)

Wu Yuan Chun
sumber
5

Cepat 3

Tambahkan kode ini di bawah ini ke VC Anda

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

Bekerja untukku

Gilad Brunfman
sumber
3

Pastikan delegasi textField Anda disetel ke pengontrol tampilan tempat Anda menulis kode terkait bidang teks.

self.textField.delegate = self
Miladinho
sumber
3

Cepat

Menggunakan fungsi opsional dari UITextFieldDelegate.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

falseberarti bidang itu dapat diminta untuk mengundurkan diri. true- paksa mundur.

dimpiax
sumber
3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

maka Anda menggunakan fungsi ini

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
Santi RibeiroO
sumber
2

Anda dapat menempatkan ini di mana saja tetapi tidak dalam UIButton

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

maka Anda dapat meletakkan kode ini di tombol (juga misalnya):

self.view.endEditing(true)

ini berhasil untuk saya

Blake Scott
sumber
2

Di pengontrol tampilan yang Anda gunakan:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }
kanishk verma
sumber
Saya suka touches Mulai func, bekerja di swift 4 terima kasih.
AJ Hernandez
-1

Anda harus menghubungkan UITextfied dengan delegasi view controller untuk membuat fungsi ini dipanggil

Abdulrahman Masoud
sumber
-1

All in One Sembunyikan Keyboard dan Pindahkan Tampilan pada Keyboard Buka: Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
Imran Rasheed
sumber