Szukałem tego wszystkiego, ale nie mogę tego znaleźć. Wiem, jak zamknąć klawiaturę, Objective-C
ale nie mam pojęcia, jak to zrobić Swift
? Czy ktoś wie?
Szukałem tego wszystkiego, ale nie mogę tego znaleźć. Wiem, jak zamknąć klawiaturę, Objective-C
ale nie mam pojęcia, jak to zrobić Swift
? Czy ktoś wie?
Odpowiedzi:
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)
}
Oto inny sposób wykonania tego zadania, jeśli zamierzasz korzystać z tej funkcji na wiele sposobów 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)
}
}
Teraz UIViewController
wystarczy, że wywołasz tę funkcję:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Ta funkcja jest zawarta jako standardowa funkcja w moim repozytorium, która zawiera wiele przydatnych rozszerzeń Swift, takich jak ta, sprawdź: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. To przynajmniej dla mnie rozwiązało. Mam nadzieję, że to komuś pomoże
Poniżej znajduje się odpowiedź na pytanie, jak usunąć klawiaturę w Xcode 6.1 za pomocą Swift:
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)
}
}
Utwórz rozszerzenie jak poniżej i zadzwoń hideKeyboardWhenTappedAround()
w kontrolerze widoku podstawowego.
//
// 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)
}
}
Najważniejsze, aby zadzwonić w kontrolerze widoku podstawowego, aby nie trzeba było dzwonić cały czas we wszystkich kontrolerach widoku.
Możesz zadzwonić
resignFirstResponder()
w dowolnej instancji UIResponder, takiej jak UITextField. Jeśli wywołasz go w widoku, który obecnie powoduje wyświetlenie klawiatury, klawiatura się odłączy.
//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
}
}
w przypadku Swift 3 jest to bardzo proste
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
jeśli chcesz ukryć klawiaturę po naciśnięciu klawisza RETURN
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
ale w drugim przypadku musisz także przekazać delegata ze wszystkich pól tekstowych do ViewController w Main.Storyboard
unrecognized selector sent to instance
z tym kodem.
Swift 3: Najłatwiejszy sposób na wyłączenie klawiatury:
//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
}
Odpowiedź Dash'a jest poprawna i preferowana. Bardziej „spieczona ziemia” to podejście view.endEditing(true)
. To powoduje view
i wszystkie jego podviews do resignFirstResponder
. Jeśli nie masz odniesienia do widoku, który chcesz odrzucić, jest to hackerskie, ale skuteczne rozwiązanie.
Pamiętaj, że osobiście uważam, że powinieneś mieć odniesienie do widoku, który chcesz zrezygnować z pierwszej odpowiedzi.
.endEditing(force: Bool)
jest barbarzyńskim podejściem; proszę nie używać tego.
swift 5 wystarczy dwie linie. Dodaj do viewDidLoad
powinien działać.
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
Jeśli gest stuknięcia zablokował inne dotknięcia, dodaj następujący wiersz:
tapGesture.cancelsTouchesInView = false
W scenorysie:
Swift 3:
Rozszerzenie z Selector
parametrem umożliwiającym wykonywanie dodatkowych czynności w funkcji zwalniania i cancelsTouchesInView
zapobieganie zniekształceniom przy dotknięciach innych elementów widoku.
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
Stosowanie:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
Użyj IQKeyboardmanager , który pomoże ci rozwiązać proste .....
///////////////////////////////
! [jak wyłączyć klawiaturę ..] [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)
}
}
Znalazłem najlepsze rozwiązanie z zaakceptowaną odpowiedzią @Esqarrouth, z pewnymi poprawkami:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboardView() {
view.endEditing(true)
}
}
Linia tap.cancelsTouchesInView = false
była krytyczna: zapewnia, że UITapGestureRecognizer
nie uniemożliwia innym elementom widoku interakcji z użytkownikiem.
Metodę dismissKeyboard()
zmieniono na nieco mniej elegancką dismissKeyboardView()
. Jest tak, ponieważ w dość starej bazie kodu mojego projektu wiele razy dismissKeyboard()
był już używany (wyobrażam sobie, że nie jest to rzadkie), powodując problemy z kompilatorem.
Następnie, jak wyżej, to zachowanie można włączyć w poszczególnych kontrolerach widoku:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
W Swift 4 dodaj @objc:
W viewDidLoad:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Funkcjonować:
@objc func dismissKeyboard() {
view.endEditing(true)
}
Dodaj to rozszerzenie do 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)
}
}
Aby rozwinąć odpowiedź Esqarrouth , zawsze używam następującego polecenia, aby zamknąć klawiaturę, szczególnie jeśli klasa, z której zwalniam klawiaturę , nie ma view
właściwości i / lub nie jest podklasąUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
I dla wygody następujące rozszerzenie UIApplcation
klasy:
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)
}
}
Jako początkujący programista może być mylące, gdy ludzie produkują bardziej wykwalifikowane i niepotrzebne odpowiedzi ... Nie musisz wykonywać żadnych skomplikowanych czynności pokazanych powyżej! ...
Oto najprostsza opcja ... W przypadku pojawienia się klawiatury w odpowiedzi na pole tekstowe - Wewnątrz funkcji ekranu dotykowego wystarczy dodać funkcję resignFirstResponder . Jak pokazano poniżej - klawiatura zostanie zamknięta, ponieważ zwolniony jest pierwszy obiekt odpowiadający (wyjście z łańcucha obiektu odpowiadającego) ...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
Używam IQKeyBoardManagerSwift dla klawiatury. jest łatwy w użyciu. wystarczy dodać pod „IQKeyboardManagerSwift”
Zaimportuj IQKeyboardManagerSwift i napisz kod didFinishLaunchingWithOptions
w AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
W szybki sposób możesz użyć
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
Dla Swift3
Zarejestruj moduł rozpoznawania zdarzeń w viewDidLoad
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
następnie musimy dodać gest do widoku w tym samym viewDidLoad.
self.view.addGestureRecognizer(tap)
Następnie musimy zainicjować zarejestrowaną metodę
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
Publikowanie jako nowej odpowiedzi, ponieważ moja edycja odpowiedzi @ King-Wizard została odrzucona.
Uczyń swoją klasę delegatem UITextField i unieważnij touchBEG.
Szybki 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)
}
}
Możesz także dodać rozpoznawanie gestów, aby zrezygnować z klawiatury. :RE
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")
}
Inną możliwością jest po prostu dodanie dużego przycisku bez treści, która leży pod wszystkimi widokami, których możesz potrzebować dotknąć. Daj mu akcję o nazwie:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
Problem z rozpoznawaniem gestów był dla mnie taki, że przechwytywał on także wszystkie dotknięcia, które chciałem otrzymać przez tableViewCells.
Jeśli masz inne widoki, które również powinny zostać dotknięte, musisz je ustawić
cancelsTouchesInView = false
Lubię to:
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)
}
Spróbuj tego, działa
Aby postępować zgodnie z zaleceniami @ modocache, aby uniknąć dzwonienia view.endEditing()
, możesz śledzić pole tekstowe, które stało się pierwszą odpowiedzią, ale jest niechlujne i podatne na błędy.
Alternatywą jest wywołanie resignFirstResponder()
wszystkich pól tekstowych w kontroler widoku . Oto przykład tworzenia kolekcji wszystkich pól tekstowych (które w moim przypadku i tak były potrzebne do kodu weryfikacyjnego):
@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]
}
Z dostępną kolekcją iteracja wszystkich z nich jest prosta:
private func dismissKeyboard()
{
for textField in allTextFields
{
textField.resignFirstResponder()
}
}
Teraz możesz zadzwonić dismissKeyboard()
w swoim rozpoznawaniu gestów (lub w dowolnym innym miejscu). Wadą jest to, że musisz zachować listę UITextField
s podczas dodawania lub usuwania pól.
Komentarze mile widziane. Jeśli występuje problem z wywołaniem resignFirstResponder()
elementów sterujących, które nie reagują jako pierwsze, lub jeśli istnieje łatwy i gwarantowany niezawodny sposób na śledzenie bieżącego pierwszego reagującego, chciałbym o tym usłyszeć!