【问题标题】:How to make keyboard dismiss when I press out of searchbar on Swift?当我在 Swift 上按下搜索栏时如何使键盘消失?
【发布时间】:2015-07-07 15:43:30
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以在下面的链接中找到答案:stackoverflow.com/questions/24908966/…
  • 我试过了,所以我得到了我的文本字段代码,它像我说的那样工作得很好,但是当我必须使用搜索栏时我遇到了一些问题,因为我不能让我的键盘关闭当我触摸搜索栏外的另一个区域时

标签: swift keyboard uisearchbar searchbar uisearchbardelegate


【解决方案1】:

试试这个:

self.mySearchController.searchBar.endEditing(true)

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

self.mySearchBar.endEditing(true)

【讨论】:

  • 你能给我任何线索吗?如何在我的搜索栏外点击时获取事件,因为当我使用文本字段时,我会使用我之前写的功能,当我在我的外部点击时它会自动获取事件文本域。你能帮我在搜索栏中有这样的功能吗
  • 您是从库中将它拖到情节提要中还是从类的内部创建的......?
  • 我把它从我的故事板上拖了出来
  • 我认为您的解决方案很好。但是我想知道当我在搜索栏外单击时会发生什么事件。如果我知道该事件,那么我可以将您的建议纳入其中,它应该可以工作。
  • 我假设您在搜索栏下使用的是表格视图或集合视图。他们都有解除键盘复选框。你可以使用它们。
【解决方案2】:
 func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        searchActive = false;
        searchProject.resignFirstResponder()
    }

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

【讨论】:

    【解决方案3】:

    经过测试并且可以正常工作!

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

    为 Swift 4.2 编辑

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        如果它不起作用,请检查您的控制器是否符合UISearchBarDelegate,其次,UISearchBarDelegate 是否知道您的类实现(如果您不太明白我在说什么,您应该学习@ 987654335@开始阅读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 之外的键盘触摸(用户可能会改变主意搜索某些内容),@ 987654326@ 也是一种简单的处理方法。

        1. Ctrl-drag Tap Gesture RecognizerObject Library 到您的视图控制器。

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

        1. 最后,写一段代码:

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

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

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

        【讨论】:

          【解决方案6】:
          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 5)。谢谢!
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            你可以使用通用的 UIViewController 扩展

            1. 只需在项目中添加一个新的swift文件,粘贴以下代码sn -p

            代码

            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() 您想要键盘隐藏功能。

            【讨论】:

              【解决方案9】:

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

              斯威夫特 4:

              self.tableView.keyboardDismissMode = .onDrag
              

              【讨论】:

              • 我什至不知道这存在,感谢分享 Dominic,工作就像一个魅力和一个很好的补充,还通过搜索按钮退出键盘。
              • 这应该是公认的答案。顺便说一句,iPhone 上的联系人应用程序似乎正是使用这种模式。
              【解决方案10】:

              这适用于 Swift 4

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

              【讨论】:

              • 你为什么要使用“self”——活动的 searchBar 对象被传递到这个委托的方法中。 “searchBar.endEditing(true)” 工作得很好。使用 self,您正在引用您的外部声明(可能是也可能不是同一个实例)。
              猜你喜欢
              • 2019-01-31
              • 1970-01-01
              • 1970-01-01
              • 2014-07-21
              • 1970-01-01
              • 2017-07-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多