60

我尝试让我的搜索栏快速打开,但是当我按下搜索栏时,我无法在屏幕上关闭键盘。当我尝试使用文本字段时,它与此代码完美配合。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }   

当我按下我的文本字段然后键盘消失时,它就起作用了。我想用我的搜索栏做到这一点,因为当我使用搜索栏并使用与文本字段相同的方式时,它根本不起作用。任何参考或代码对我来说都非常有用。

4

10 回答 10

87

尝试这个 :

self.mySearchController.searchBar.endEditing(true)

用您创建的控制器名称替换 mySearchController。如果您没有以编程方式创建它,而是您只是从库中拖动了一个搜索栏,那么 IBoutlet 您的可搜索到您的类并将其引用为:

self.mySearchBar.endEditing(true)
于 2015-04-28T17:37:29.430 回答
34

我发现使用表格视图进行解雇更容易和更简单。(如果您使用的是表格视图)

斯威夫特 4:

self.tableView.keyboardDismissMode = .onDrag
于 2019-04-02T03:32:35.140 回答
30

测试和工作!

func searchBarSearchButtonClicked(searchBar: UISearchBar) 
{
    searchActive = false;
    self.mySearchBar.endEditing(true)
}

为 Swift 4.2 编辑

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
    {
        searchActive = false
        self.searchBar.endEditing(true)
    }
于 2015-09-21T18:38:08.913 回答
10
 func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        searchActive = false;
        searchProject.resignFirstResponder()
    }

当用户单击键盘上的搜索按钮时将调用此方法。所以在这里我们可以关闭键盘。我认为这是正确的方法。

于 2015-07-30T09:51:39.387 回答
9

首先,Apple 的UISearchBarDelegate是当用户单击搜索按钮时隐藏键盘的正确解决方案,而UISearchBar的实例是first responder(学习UIResponder)。简而言之,searchBarSearchButtonClicked(_:)是您完成此任务所需要的。

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder() // hides the keyboard.
    doThingsForSearching()
}

如果它不起作用,请检查您的控制器是否符合UISearchBarDelegate,其次,是否UISearchBarDelegate了解您的类实现(如果您不太明白我在说什么,您应该学习从这里delegation pattern开始阅读):

class YourAwesomeViewController: UIViewController, UISearchBarDelegate { // pay attention here

    @IBOutlet weak var yourSearchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.yourSearchBar.delegate = self // and it's important too
    }
}

此外,如果您需要在search bar不触摸搜索按钮的情况下隐藏键盘触摸(用户可能会改变主意搜索某些内容),UITapGestureRecognizer也是一种简单的处理方法。

  1. Ctrl-drag一个Tap Gesture RecognizerObject Library你的视图控制器。

在此处输入图像描述

  1. Ctrl-drag最近Tap Gesture Recognizerdocument outline情节提要中添加到您的类实现中的IBAction.

在此处输入图像描述

  1. 最后,写一段代码:

@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) { self.yourSearchBar.resignFirstResponder() }

此外,不要忘记创建 @IBOutlet搜索栏以访问您的类实现。

上述两种变体都在我的项目中运行良好。

于 2017-10-06T01:59:55.367 回答
8

Swift 4+:

You can try, creating a tap gesture and add in the self.view

let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.singleTap(sender:)))
singleTapGestureRecognizer.numberOfTapsRequired = 1
singleTapGestureRecognizer.isEnabled = true
singleTapGestureRecognizer.cancelsTouchesInView = false
self.view.addGestureRecognizer(singleTapGestureRecognizer)

and in selector func you call self.searchBar.resignFirstResponder

@objc func singleTap(sender: UITapGestureRecognizer) {
    self.searchBar.resignFirstResponder()
}
于 2018-04-14T16:47:58.117 回答
4

您可以使用通用 UIViewController 扩展

  1. 只需在项目中添加一个新的 swift 文件并粘贴以下代码片段

代码

extension UIViewController {

    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard(_:)))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
        view.endEditing(true)

        if let nav = self.navigationController {
            nav.view.endEditing(true)
        }
    }
 }
  1. 现在从您想要键盘隐藏功能 的viewDidLoad方法调用hideKeyboardWhenTappedAround() 。
于 2018-09-21T09:30:05.537 回答
3
class MaCaveViewController: UIViewController, UISearchBarDelegate {
    
    @IBOutlet weak var searchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
    }

    // When button "Search" pressed
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
        print("end searching --> Close Keyboard")
        self.searchBar.endEditing(true)
    }
}

这对我来说非常有效。

于 2018-02-12T10:59:44.147 回答
1

这在Swift 4中对我有用

   func searchBarSearchButtonClicked(_ searchBar: UISearchBar){

    self.searchBar.endEditing(true)

    }
于 2019-06-16T18:19:06.007 回答
1

我们可以通过以下方法做到这一点

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true;
    }

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = false;
    }
于 2016-11-22T14:27:29.573 回答