我一直在寻找这个,但我似乎无法找到它。我知道如何使用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()
}
这个函数作为标准函数包含在我的repo中,其中包含很多有用的Swift Extensions,如下所示,请查看:https://github.com/goktugyil/EZSwiftExtensions
斯威夫特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
}
作为参数扩展,以便能够在dismiss函数和Selector
中执行其他操作,以防止在视图的其他元素上触摸时出现失真。
cancelsTouchesInView
用法:
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
![如何禁用键盘..] [1]
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
如果您使用滚动视图,它可能会更简单。
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接受的答案,并进行了一些调整:
Dismiss interactively
行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()
在Swift 4中,添加@objc:
在viewDidLoad中:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
功能:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
@objc func dismissKeyboard() {
view.endEditing(true)
}
作为一名新手程序员,当人们产生更多熟练和不必要的回答时,它可能会令人困惑......你不必做上面显示的任何复杂的事情!......
这是最简单的选项...如果键盘出现以响应文本字段 - 在触摸屏功能内部只需添加resignFirstResponder功能。如下图所示 - 键盘将关闭,因为第一响应者已释放(退出响应者链)...
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)
}
}
这个内核从UIView中的所有(任何)UITextField中调出Keyboard
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
在swift你可以使用
self.view.endEditing(true)
将此扩展添加到ViewController:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
关于如何使用下面的Swift关闭Xcode 6.1键盘的问题的答案:
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)
}
}
(Qazxswpoi)。
我使用IQKeyBoardManagerSwift键盘。它很容易使用。只需添加pod'IQKeyboardManagerSwift'
导入IQKeyboardManagerSwift并在 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)
}
}
中的didFinishLaunchingWithOptions
上编写代码。
AppDelegate
我总是使用以下内容:
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
或者甚至作为扩展:
UIApplication.shared.keyWindow?.endEditing(true)
这样,如果我试图取消编辑的类没有extension UIApplication {
/// Dismiss keyboard from key window.
/// Example Usage: `UIApplication.endEditing(true)`.
///
/// - Parameters:
/// - force: specify `true` to force first responder to resign.
open class func endEditing(_ force: Bool = false) {
shared.keyWindow?.endEditing(force)
}
}
属性或者不是view
的子类,我可以调用UIView
。
对于Swift3
在viewDidLoad中注册事件识别器
UIApplication.endEditing(true)
然后我们需要在同一个viewDidLoad中将手势添加到视图中。
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
然后我们需要初始化已注册的方法
self.view.addGestureRecognizer(tap)
swift 5只需两行即可。加入你的func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
应该工作。
viewDidLoad
如果您的点按手势阻止了其他一些触摸,请添加以下行:
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
另一种可能性是简单地添加一个大按钮,其中没有内容位于您可能需要触摸的所有视图下方。给它一个名为的动作:
tapGesture.cancelsTouchesInView = false
手势识别器的问题对我来说,它也抓住了我想通过tableViewCells接收到的所有触摸。
如果您有其他视图也应该接受触摸,您必须设置@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
像这样:
cancelsTouchesInView = false
let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
elsewhereTap.cancelsTouchesInView = false
self.view.addGestureRecognizer(elsewhereTap)
试试这个,它正在工作
您还可以添加轻触手势识别器来重新设置键盘。 :d
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
view.endEditing(true)
}
要关注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")
}
以避免调用@modocache's recommendation,您可以跟踪成为第一响应者的文本字段,但这很麻烦并且容易出错。
另一种方法是在viewcontroller中的所有文本字段上调用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()
s列表。
欢迎评论。如果在不是第一响应者的控件上调用UITextField
有问题,或者如果有一种简单且有保证的非错误方式来跟踪当前的第一响应者,我很乐意听到它!
我在uisearchbar上工作了。见我的。
resignFirstResponder()
我更喜欢这种单线程:
import UIKit
class BidderPage: UIViewController,UISearchBarDelegate,UITableViewDataSource {
let recognizer = UITapGestureRecognizer()
// Set recogniser as public in case of tableview and didselectindexpath.
func searchBarTextDidBeginEditing(searchBar: UISearchBar)
{
recognizer.addTarget(self, action: "handleTap:")
view.addGestureRecognizer(recognizer)
}
func handleTap(recognizer: UITapGestureRecognizer) {
biddersearchbar .resignFirstResponder()
}
func searchBarTextDidEndEditing(searchBar: UISearchBar)
{
view .removeGestureRecognizer(recognizer)
}
只需将它放在重写viewDidLoad函数中,无论你希望它发生在哪个子类UIViewController中,然后将以下代码放在项目中名为“UIViewController + dismissKeyboard.swift”的新空文件中:
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboardFromView:"))
如下所示创建扩展名并在基本视图控制器中调用resignFirstResponder()
。
hideKeyboardWhenTappedAround()
//
// 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)
}
}
对于Swift 3来说非常简单
//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
}
}
如果你想按RETURN键隐藏键盘
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
但在第二种情况下,您还需要将委托从所有textField传递到Main.Storyboard中的ViewController
Dash的答案是正确和首选的。一个更“焦土”的方法是打电话给func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
。这导致view.endEditing(true)
及其所有子视图到view
。如果你没有引用你想解雇的视图,这是一个hacky但有效的解决方案。
请注意,我个人认为您应该参考您希望辞职的第一响应者。
resignFirstResponder
是一种野蛮的方法;请不要使用它。
Swift 3:解除键盘的最简单方法:
.endEditing(force: Bool)
在故事板中: