Я все це шукав, але, здається, не можу його знайти. Я знаю, як відхилити клавіатуру за допомогою, Objective-C
але я поняття не маю, як це зробити за допомогою Swift
? Хтось знає?
Я все це шукав, але, здається, не можу його знайти. Я знаю, як відхилити клавіатуру за допомогою, Objective-C
але я поняття не маю, як це зробити за допомогою Swift
? Хтось знає?
Відповіді:
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)
}
Ось ще один спосіб зробити це завдання, якщо ви збираєтеся використовувати цю функціональність кілька разів 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)
}
}
Тепер у кожному UIViewController
, що вам потрібно зробити, це викликати цю функцію:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Ця функція включена в стандартну функцію мого репо, яка містить багато корисних розширень Swift, як ця, перевірте це: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. Це вирішило це для мене принаймні. Сподіваюся, що це комусь допоможе
Відповідь на ваше запитання про те, як відмовити клавіатуру в Xcode 6.1 за допомогою 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)
}
}
Створіть розширення, як показано нижче, і зателефонуйте hideKeyboardWhenTappedAround()
у контролер Base view
//
// 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)
}
}
Найголовніше зателефонувати у ваш контролер Base View, щоб не потрібно постійно телефонувати у всіх контролерах перегляду.
Можна зателефонувати
resignFirstResponder()
у будь-якому екземплярі UIResponder, наприклад UITextField. Якщо ви зателефонуєте до цього виду, який в даний час призводить до відображення клавіатури, клавіатура буде відхилена.
//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
}
}
для Swift 3 це дуже просто
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
якщо ви хочете приховати клавіатуру при натисканні клавіші RETURN
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
але у другому випадку вам також потрібно буде передати делегат від усіх текстових полів ViewController в Main.Storyboard
unrecognized selector sent to instance
з цим кодом.
Swift 3: Найпростіший спосіб відхилення клавіатури:
//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
}
Відповідь тире правильна і бажана. Більш "підпалена земля" підхід - це закликати view.endEditing(true)
. Це спричиняє view
і всі його підгляди до resignFirstResponder
. Якщо у вас немає посилання на вигляд, який ви хочете відпустити, це хакізне, але ефективне рішення.
Зауважте, що особисто я вважаю, що ви повинні мати посилання на вигляд, який ви хотіли б подати у відставку першого відповідача.
.endEditing(force: Bool)
- варварський підхід; будь ласка, не використовуйте його.
стрімких 5 достатньо двох ліній. Додайте до свого, viewDidLoad
має працювати.
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
Якщо ваш жест торкання заблокував деякі інші дотики, додайте цей рядок:
tapGesture.cancelsTouchesInView = false
У розкладі:
Швидкий 3:
Розширення з Selector
параметром як, щоб мати можливість виконувати додаткові речі у функції відхилення та cancelsTouchesInView
запобігати перекрученню за допомогою дотиків до інших елементів подання.
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
Використання:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
Використовуйте IQKeyboardmanager, який допоможе вам легко вирішити .....
///////////////////////////////////////////
! [як відключити клавіатуру ..] [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)
}
}
Я знайшов найкраще рішення, що включав прийняту відповідь від @Esqarrouth з деякими корективами:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboardView() {
view.endEditing(true)
}
}
Рядок tap.cancelsTouchesInView = false
був критичним: він забезпечує те, що UITapGestureRecognizer
не заважає іншим елементам подання отримувати взаємодію з користувачем.
Метод dismissKeyboard()
був змінений на трохи менш елегантний dismissKeyboardView()
. Це тому, що в досить старій кодовій базі мого проекту багато разів dismissKeyboard()
використовувались (я думаю, це не рідкість), викликаючи проблеми компілятора.
Потім, як зазначено вище, цю поведінку можна включити в окремих контролерах перегляду:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
У Swift 4 додайте @objc:
У переглядіDidLoad:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Функція:
@objc func dismissKeyboard() {
view.endEditing(true)
}
Додайте це розширення у свій 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)
}
}
Щоб розширити відповідь Ескароута , я завжди використовую наступне для відхилення клавіатури, особливо якщо клас, з якого я відхиляю клавіатуру , не має view
властивості та / або не є підкласомUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
І, для зручності, наступне розширення до UIApplcation
класу:
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)
}
}
Як початківець програміст може бути заплутаним, коли люди отримують більш кваліфіковані та непотрібні відповіді ... Вам не потрібно робити жоден із складних речей, показаних вище! ...
Ось найпростіший варіант ... Якщо клавіатура з’являється у відповідь на текстове поле - Всередині функції сенсорного екрану просто додайте функцію resignFirstResponder . Як показано нижче - клавіатура закриється, тому що Перший Відповідач відпущений (виходить із ланцюжка Відповідь) ...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
Я використовую IQKeyBoardManagerSwift для клавіатури. вона проста у використанні. просто додайте стручку "IQKeyboardManagerSwift"
Імпортуйте IQKeyboardManagerSwift і запишіть код didFinishLaunchingWithOptions
у AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
Швидко можна використовувати
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
Для Swift3
Зареєструйте розпізнавач подій у viewDidLoad
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
тоді нам потрібно додати жест до подання в тому ж viewDidLoad.
self.view.addGestureRecognizer(tap)
Потім нам потрібно ініціалізувати зареєстрований метод
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
Опублікування як нова відповідь, оскільки мою редакцію відповіді @ King-Wizard було відхилено.
Зробіть свій клас делегатом UITextField та скасуйте дотикиBegan.
Швидкий 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)
}
}
Ви також можете додати розпізнавальник жестів, щоб відкликати клавіатуру. : 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")
}
Інша можливість - просто додати велику кнопку без вмісту, який лежить під усіма видами перегляду, до яких можна зачепити. Надайте йому дію з назвою:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
Проблема з розпізнавачем жестів була для мене тим, що вона також охоплювала всі штрихи, які я хотів отримати від tableViewCells.
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
view.endEditing(true)
}
Спробуйте це, це працює
Щоб дотримуватися рекомендації @ modocache, щоб уникнути дзвінків view.endEditing()
, ви можете відслідковувати текстове поле, яке стало першим відгуком, але це брудно і схильне до помилок.
Альтернатива - дзвонити resignFirstResponder()
на всі текстові поля в контролері перегляду . Ось приклад створення колекції всіх текстових полів (який у моєму випадку був потрібний для перевірки коду):
@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]
}
З колекцією, що доступна, це просте завдання пройти через усі:
private func dismissKeyboard()
{
for textField in allTextFields
{
textField.resignFirstResponder()
}
}
Тож тепер можна зателефонувати dismissKeyboard()
в розпізнавальник жестів (або там, де вам підходить). Недолік - це те, що ви повинні підтримувати список UITextField
s, коли ви додаєте або видаляєте поля.
Коментарі вітаються. Якщо є проблема із закликом resignFirstResponder()
до елементів управління, які не є першим відгуком, або якщо існує легкий і гарантований невідкладний спосіб відстежити поточного першого респондента, я хотів би почути про це!