Szukałem tego wszystkiego, ale nie mogę tego znaleźć. Wiem, jak zamknąć klawiaturę, Objective-Cale 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-Cale 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 UIViewControllerwystarczy, ż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 instancez 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 viewi 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 viewDidLoadpowinien 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 Selectorparametrem umożliwiającym wykonywanie dodatkowych czynności w funkcji zwalniania i cancelsTouchesInViewzapobieganie 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 = falsebyła krytyczna: zapewnia, że UITapGestureRecognizernie 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 viewwłaściwości i / lub nie jest podklasąUIView .
UIApplication.shared.keyWindow?.endEditing(true)
I dla wygody następujące rozszerzenie UIApplcationklasy:
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 didFinishLaunchingWithOptionsw 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ę UITextFields 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ć!