当我在 Swift 上按下搜索栏时如何使键盘消失?

Posted

技术标签:

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

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

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

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

【问题讨论】:

您可以在下面的链接中找到答案:***.com/questions/24908966/… 我试过了,所以我得到了我的文本字段代码,它像我说的那样工作得很好,但是当我必须使用搜索栏时我遇到了一些问题,因为我不能让我的键盘关闭当我触摸搜索栏外的另一个区域时 【参考方案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@ 也是一种简单的处理方法。

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

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

    最后,写一段代码:

@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 扩展

    只需在项目中添加一个新的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)
        
    
 
    现在从 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,您正在引用您的外部声明(可能是也可能不是同一个实例)。

以上是关于当我在 Swift 上按下搜索栏时如何使键盘消失?的主要内容,如果未能解决你的问题,请参考以下文章

如何在按下导航栏时快速隐藏键盘

如何在 QT 虚拟键盘上按下信号键并播放声音点击轨道?

按下按钮后如何使“提交”表单从 Ajax 工作

如何将 Qt 按钮映射到键盘按键

ios UIsearchcontroller 中的搜索栏消失

Swift UI VStack 对齐。按下时使文本字段与键盘一起出现