使用 UISearchBar 关闭键盘,而不让第一响应者辞职

Posted

技术标签:

【中文标题】使用 UISearchBar 关闭键盘,而不让第一响应者辞职【英文标题】:Dismissing the keyboard with UISearchBar, without resigning first responder 【发布时间】:2010-06-09 13:04:54 【问题描述】:

嘿,我正在 iPhone 上开发一个基于导航的应用程序,类似于联系人应用程序。当您在搜索栏中输入内容并在表格中滚动(在联系人应用程序中)时,键盘就会消失。我不认为它会放弃第一响应者,因为当我尝试在 -(void)scrollViewDidScroll:(UIScrollView *)scrollView 中执行此操作时,它会禁用取消按钮,这在联系人应用程序中不会发生。基本上我的问题是如何在不禁用取消按钮的情况下关闭键盘,就像在联系人应用程序中一样?

谢谢

【问题讨论】:

哇。哈哈,我使用的教程没有使用搜索显示控制器,无论出于何种原因......使用它使它完全符合我的要求。这很有趣,因为我什至匹配了当你开始搜索时发生的覆盖的黑暗,但现在它发生了两次,所以它变得非常黑暗。 【参考方案1】:

好吧,刚刚遇到了这个非常古老的问题。 您可以在开始滚动时启用“取消”按钮,如下所示:

func scrollViewWillBeginDragging(scrollView: UIScrollView) 
    searchBar.resignFirstResponder()
    let searchCancelButton = searchBar.valueForKey("cancelButton") as! UIButton
    searchCancelButton.enabled = true // <-- THIS line is the trick


斯威夫特 4

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) 
    searchBar.resignFirstResponder()
    let cancelButton = searchBar.value(forKey: "cancelButton") as! UIButton
    cancelButton.isEnabled = true

【讨论】:

【参考方案2】:

tableView.keyboardDismissMode = .onDrag 添加到viewDidLoad() 就像一个魅力。

【讨论】:

不幸的是,当我尝试这个时,取消按钮一直处于禁用状态【参考方案3】:

(正如自我回答评论中所暗示的)如果您想获得像内置联系人应用程序这样的表格搜索行为,您不能只是将 UISearchBar 拍到带有 UITableView 的视图中,而是需要使用一个 UITableViewController 和一个 Search Display Controller。这个示例应用是一个完美的指南:

https://developer.apple.com/library/ios/#samplecode/TableSearch/Introduction/Intro.html

【讨论】:

【参考方案4】:

我尝试了多个选项,但没有达到所有所需的输出,例如将取消与键盘一起隐藏。

所以我使用了searchBar.inputAccessoryView,它将在键盘上方可见,右侧有一个按钮(工具栏)。

    class AnyViewClass

        func createSearch()
            searchBar.inputAccessoryView = ViewsFactory.createAccessoryView(withButtonType:.done,target: self, action:#selector(YourClass.keyboardDonePressed))
        


        @objc private func keyboardDonePressed()
             searchBar?.resignFirstResponder()
             searchBar?.text = nil
        



class ViewsFactory 

    class func createAccessoryView(withButtonType type:UIBarButtonItem.SystemItem,
                                   target: Any?,
                                   action: Selector?) -> UIToolbar

        var accessoryDoneButton: UIBarButtonItem!
        let accessoryToolBar = UIToolbar(frame: CGRect(x: 0,
                                                       y: 0,
                                                       width: UIScreen.main.bounds.width,
                                                       height: 44))

        let emptySpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                                         target: nil,
                                         action: nil)
        accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done,
                                              target: target,
                                              action: action)
        accessoryDoneButton.tintColor = <any color>
        accessoryToolBar.items = [emptySpace, accessoryDoneButton]
        return accessoryToolBar

    

【讨论】:

以上是关于使用 UISearchBar 关闭键盘,而不让第一响应者辞职的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar-更改范围而不使表格变灰?

如何始终显示软键盘而不让它被关闭?

在 UISearchBar 中按“x”时关闭键盘

UISearchbar clearButton 强制键盘出现

自定义键盘文本完全替换 UISearchBar 中的文本,而不是添加到其中 [iOS]

UISearchBar resignFirstResponder无法正常工作