使用Swift触摸任何地方关闭iOS键盘

问题描述 投票:352回答:36

我一直在寻找这个,但我似乎无法找到它。我知道如何使用Objective-C解雇键盘,但我不知道如何使用Swift?有人知道吗?

ios swift uikeyboard
36个回答
1170
投票
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


9
投票

斯威夫特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)
    }
}

8
投票

![如何禁用键盘..] [1]

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}

func dismissKeyboard() {
    view.endEditing(true)
    // do aditional stuff
}

7
投票

如果您使用滚动视图,它可能会更简单。

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) } }

只需在故事板中选择即可。


6
投票

我发现最好的解决方案包括@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()

6
投票

在Swift 4中,添加@objc:

在viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}

功能:

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)

5
投票
@objc func dismissKeyboard() {
  view.endEditing(true)
}

5
投票

作为一名新手程序员,当人们产生更多熟练和不必要的回答时,它可能会令人困惑......你不必做上面显示的任何复杂的事情!......

这是最简单的选项...如果键盘出现以响应文本字段 - 在触摸屏功能内部只需添加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)
  }
}

4
投票

这个内核从UIView中的所有(任何)UITextField中调出Keyboard

override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
    MyTextField.resignFirstResponder()
}

4
投票

在swift你可以使用

self.view.endEditing(true)

4
投票

将此扩展添加到ViewController:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)

}

111
投票

关于如何使用下面的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)。


4
投票

我使用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

4
投票

我总是使用以下内容:

///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


3
投票

对于Swift3

在viewDidLoad中注册事件识别器

UIApplication.endEditing(true)

然后我们需要在同一个viewDidLoad中将手势添加到视图中。

let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))

然后我们需要初始化已注册的方法

self.view.addGestureRecognizer(tap)

3
投票

swift 5只需两行即可。加入你的func hideKeyBoard(sender: UITapGestureRecognizer? = nil){ view.endEditing(true) } 应该工作。

viewDidLoad

如果您的点按手势阻止了其他一些触摸,请添加以下行:

 let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
 view.addGestureRecognizer(tapGesture)

2
投票

另一种可能性是简单地添加一个大按钮,其中没有内容位于您可能需要触摸的所有视图下方。给它一个名为的动作:

tapGesture.cancelsTouchesInView = false

手势识别器的问题对我来说,它也抓住了我想通过tableViewCells接收到的所有触摸。


2
投票

如果您有其他视图也应该接受触摸,您必须设置@IBAction func dismissKeyboardButton(sender: AnyObject) { view.endEditing(true) }

像这样:

cancelsTouchesInView = false

2
投票
let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    elsewhereTap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(elsewhereTap)

试试这个,它正在工作


1
投票

您还可以添加轻触手势识别器来重新设置键盘。 :d

override func viewDidLoad() {
        super.viewDidLoad()

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))

}

func tap(sender: UITapGestureRecognizer){
        print("tapped")
        view.endEditing(true)
}

1
投票

When there is more than one text field in the view

要关注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有问题,或者如果有一种简单且有保证的非错误方式来跟踪当前的第一响应者,我很乐意听到它!


1
投票

我在uisearchbar上工作了。见我的。

resignFirstResponder()

34
投票

你可以打电话

Source of this information

在任何UIResponder实例上,例如UITextField。如果在当前导致键盘显示的视图上调用它,则键盘将关闭。


1
投票

我更喜欢这种单线程:

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:"))

28
投票

Swift 4正在工作

如下所示创建扩展名并在基本视图控制器中调用resignFirstResponder()

hideKeyboardWhenTappedAround()

19
投票
//
//  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)
    }
}

17
投票

对于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


10
投票

Dash的答案是正确和首选的。一个更“焦土”的方法是打电话给func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } 。这导致view.endEditing(true)及其所有子视图到view。如果你没有引用你想解雇的视图,这是一个hacky但有效的解决方案。

请注意,我个人认为您应该参考您希望辞职的第一响应者。 resignFirstResponder是一种野蛮的方法;请不要使用它。


10
投票

Swift 3:解除键盘的最简单方法:

.endEditing(force: Bool)

9
投票

在故事板中:

  1. 选择TableView
  2. 从右侧选择属性检查器
  3. 在键盘部分 - 选择所需的关闭模式
© www.soinside.com 2019 - 2024. All rights reserved.