当我在 Swift 上按下搜索栏时如何关闭键盘?

How to make keyboard dismiss when I press out of searchbar on Swift?

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

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

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

试试这个:

self.mySearchController.searchBar.endEditing(true)

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

self.mySearchBar.endEditing(true)
 func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        searchActive = false;
        searchProject.resignFirstResponder()
    }

当用户单击 keyboard.So 上的搜索按钮时将调用此方法,我们可以忽略 keyboard.I 认为这是正确的方法。

已测试并正常工作!

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

编辑 Swift 4.2

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

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

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

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = false;
    }

首先,苹果的UISearchBarDelegate is the correct solution to hide keyboard when users click a search button while UISearchBar's instance is the first responder (learn UIResponder). In short, searchBarSearchButtonClicked(_:)就是你完成这个任务所需要的

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

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

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 之外的键盘触摸(用户可能会改变主意search something), UITapGestureRecognizer 也是处理该问题的简单方法。

  1. Ctrl-dragObject Library 到您的视图控制器的 Tap Gesture Recognizer

  1. Ctrl-drag 最近从情节提要中的 document outline 添加的 Tap Gesture Recognizer 作为 IBAction.
  2. 到您的 class 实现

  1. 最后写一段代码:

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

此外,不要忘记为搜索栏创建 @IBOutlet,以便在您的 class 实现中进行访问。

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

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

这对我来说效果很好。

Swift 4+:

您可以试试,创建一个点击手势并添加到 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)

并在选择器函数中调用 self.searchBar.resignFirstResponder

@objc func singleTap(sender: UITapGestureRecognizer) {
    self.searchBar.resignFirstResponder()
}

您可以使用通用的 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() 要隐藏键盘的功能。

我发现使用 Table 查看解雇更容易和更简单。 (如果您使用的是 table 视图)

Swift 4:

self.tableView.keyboardDismissMode = .onDrag

这对我有用 Swift 4

   func searchBarSearchButtonClicked(_ searchBar: UISearchBar){

    self.searchBar.endEditing(true)

    }