当我在Swift上按下搜索栏时如何让键盘解除?

aji*_*aji 45 keyboard uisearchbar uisearchbardelegate searchbar swift

我尝试在swift上创建我的搜索栏,但是当我按下搜索栏时,我有一个问题就是在屏幕上关闭键盘.当我尝试使用textfield时,它可以很好地使用此代码.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }   
Run Code Online (Sandbox Code Playgroud)

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

Kor*_*and 67

试试这个 :

self.mySearchController.searchBar.endEditing(true)
Run Code Online (Sandbox Code Playgroud)

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

self.mySearchBar.endEditing(true)
Run Code Online (Sandbox Code Playgroud)

  • 我假设您在搜索栏下使用tableview或集合视图.他们都解雇了键盘复选框.你可以使用它们. (3认同)

Thi*_*guy 19

经过测试和工作!

func searchBarSearchButtonClicked(searchBar: UISearchBar) 
{
    searchActive = false;
    self.mySearchBar.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)


小智 8

 func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        searchActive = false;
        searchProject.resignFirstResponder()
    }
Run Code Online (Sandbox Code Playgroud)

当用户点击键盘上的搜索按钮时,将调用此方法.这里我们可以解除键盘.我认为这是正确的方法.


Iva*_*rov 7

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

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder() // hides the keyboard.
    doThingsForSearching()
}
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,请检查您的控制器是否符合要求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
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要隐藏触摸键盘的外部而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为搜索栏创建在类实现内部具有访问权限的对象。

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


小智 7

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

斯威夫特4:

self.tableView.keyboardDismissMode = .onDrag
Run Code Online (Sandbox Code Playgroud)

  • 我什至不知道这个存在,感谢多米尼克的分享,它的工作就像一个魅力,也是通过搜索按钮放弃键盘的一个很好的补充。 (5认同)
  • 这应该是公认的答案。顺便说一句,iPhone 上的通讯录应用程序似乎正是使用这种模式。 (2认同)

小智 5

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有效。


Saz*_*han 5

迅捷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)
Run Code Online (Sandbox Code Playgroud)

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

@objc func singleTap(sender: UITapGestureRecognizer) {
    self.searchBar.resignFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)


dip*_*dip 5

您可以使用通用的 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)
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)
  1. 现在从您想要键盘隐藏功能的 viewDidLoad方法调用hideKeyboardWhenTappedAround() 。