Ho cercato dappertutto questo, ma non riesco a trovarlo. So come chiudere la tastiera usando Objective-C
ma non ho idea di come farlo usando Swift
? Qualcuno sa?
Ho cercato dappertutto questo, ma non riesco a trovarlo. So come chiudere la tastiera usando Objective-C
ma non ho idea di come farlo usando Swift
? Qualcuno sa?
Risposte:
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)
}
Ecco un altro modo per eseguire questa attività se si intende utilizzare questa funzionalità in più 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)
}
}
Ora in ogni UIViewController
, tutto ciò che devi fare è chiamare questa funzione:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Questa funzione è inclusa come funzione standard nel mio repository che contiene molte utili estensioni Swift come questa, date un'occhiata: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. Questo mi ha risolto almeno per me. Spero che questo aiuti qualcuno
Una risposta alla tua domanda su come chiudere la tastiera in Xcode 6.1 usando Swift di seguito:
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)
}
}
Crea un interno come di seguito e chiama hideKeyboardWhenTappedAround()
nel controller della vista Base.
//
// 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)
}
}
La cosa più importante da chiamare nel controller di visualizzazione di base in modo che non sia necessario chiamare sempre in tutti i controller di visualizzazione.
Puoi chiamare
resignFirstResponder()
su qualsiasi istanza di un UIResponder, come un UITextField. Se lo chiami nella vista che sta causando la visualizzazione della tastiera, la tastiera verrà chiusa.
//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
}
}
per Swift 3 è molto semplice
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
se si desidera nascondere la tastiera premendo il tasto INVIO
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
ma nel secondo caso dovrai anche passare i delegati da tutti i campi di testo al ViewController nel Main.Storyboard
unrecognized selector sent to instance
con questo codice.
Swift 3: il modo più semplice per chiudere la tastiera:
//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
}
La risposta di Dash è corretta e preferita. Un approccio più "terra bruciata" è quello di chiamare view.endEditing(true)
. Ciò causa view
e tutte le sue visualizzazioni resignFirstResponder
. Se non hai un riferimento alla vista che desideri ignorare, questa è una soluzione confusa ma efficace.
Nota che personalmente penso che dovresti avere un riferimento alla vista che vorresti dimettersi dal primo soccorritore.
.endEditing(force: Bool)
è un approccio barbaro; per favore non usarlo.
bastano 5 veloci solo due righe. Aggiungi nel tuo viewDidLoad
dovrebbe funzionare.
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
Se il gesto del tuo tocco ha bloccato altri tocchi, quindi aggiungi questa riga:
tapGesture.cancelsTouchesInView = false
Nello storyboard:
Swift 3:
Estensione con Selector
parametro come per essere in grado di fare cose aggiuntive nella funzione di eliminazione e cancelsTouchesInView
prevenire distorsioni con tocchi su altri elementi della vista.
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
Uso:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
Usa IQKeyboardmanager che ti aiuterà a risolvere facilmente .....
/////////////////////////////////////////
! [come disabilitare la tastiera ..] [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)
}
}
Ho trovato che la soluzione migliore includeva la risposta accettata da @Esqarrouth, con alcune modifiche:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboardView() {
view.endEditing(true)
}
}
La linea tap.cancelsTouchesInView = false
era critica: assicura che UITapGestureRecognizer
non impedisca ad altri elementi della vista di ricevere l'interazione dell'utente.
Il metodo è dismissKeyboard()
stato cambiato in leggermente meno elegante dismissKeyboardView()
. Questo perché nella base di codice abbastanza vecchia del mio progetto, ci sono state numerose volte in cui è dismissKeyboard()
stato già utilizzato (immagino che ciò non sia insolito), causando problemi al compilatore.
Quindi, come sopra, questo comportamento può essere abilitato nei singoli controller di visualizzazione:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
In Swift 4, aggiungi @objc:
Nel viewDidLoad:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Funzione:
@objc func dismissKeyboard() {
view.endEditing(true)
}
Aggiungi questa estensione al tuo ViewController:
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)
}
}
Per espandere la risposta di Esqarrouth , uso sempre quanto segue per chiudere la tastiera, specialmente se la classe da cui sto eliminando la tastiera non ha una view
proprietà e / o non è una sottoclasse diUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
E, per comodità, la seguente estensione alla UIApplcation
classe:
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)
}
}
Come programmatore principiante può essere fonte di confusione quando le persone producono risposte più qualificate e non necessarie ... Non devi fare nessuna delle cose complicate mostrate sopra! ...
Ecco l'opzione più semplice ... Nel caso in cui la tua tastiera appaia in risposta al campo di testo - All'interno della tua funzione touch screen aggiungi semplicemente la funzione resignFirstResponder . Come mostrato di seguito - la tastiera si chiuderà perché viene rilasciato il primo risponditore (uscendo dalla catena di risponditori) ...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
Ho usato IQKeyBoardManagerSwift per la tastiera. è facile da usare. basta aggiungere il pod "IQKeyboardManagerSwift"
Importa IQKeyboardManagerSwift e scrivi il codice su didFinishLaunchingWithOptions
in AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
In breve tempo puoi usare
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
Per Swift3
Registrare un riconoscimento eventi in viewDidLoad
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
quindi dobbiamo aggiungere il gesto nella vista nella stessa viewDidLoad.
self.view.addGestureRecognizer(tap)
Quindi è necessario inizializzare il metodo registrato
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
Pubblicare come nuova risposta poiché la mia modifica della risposta di @ King-Wizard è stata respinta.
Rendi la tua classe un delegato di UITextField e sostituisci i tocchiBegan.
Swift 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)
}
}
Puoi anche aggiungere un riconoscitore di gesti di tocco per dare le dimissioni dalla tastiera. : 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")
}
Un'altra possibilità è semplicemente aggiungere un pulsante grande senza contenuti che si trovano sotto tutte le viste che potresti dover toccare. Dagli un'azione denominata:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
Il problema con un riconoscimento dei gesti era per me, che catturava anche tutti i tocchi che volevo ricevere da tableViewCells.
Se hai altre visualizzazioni che dovrebbero ricevere anche il tocco, devi impostare
cancelsTouchesInView = false
Come questo:
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)
}
Prova questo, funziona
Seguire le raccomandazioni di @ modocache per evitare di chiamareview.endEditing()
, è possibile tenere traccia del campo di testo che è diventato il primo risponditore, ma che è disordinato e soggetto a errori.
Un'alternativa è chiamare resignFirstResponder()
tutti i campi di testo nel viewcontroller . Ecco un esempio di creazione di una raccolta di tutti i campi di testo (che nel mio caso era comunque necessario per il codice di convalida):
@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]
}
Con la raccolta disponibile, è semplice iterare tutti:
private func dismissKeyboard()
{
for textField in allTextFields
{
textField.resignFirstResponder()
}
}
Quindi ora puoi chiamare il dismissKeyboard()
tuo riconoscimento dei gesti (o ovunque sia appropriato per te). Lo svantaggio è che è necessario mantenere l'elenco di messaggi UITextField
quando si aggiungono o rimuovono i campi.
Commenti benvenuti. Se c'è un problema con l'invito resignFirstResponder()
a controlli che non sono il primo risponditore, o se esiste un modo semplice e garantito non corretto di rintracciare l'attuale primo risponditore, mi piacerebbe saperlo!