使用UISearchBar解除键盘,而无需重新启动第一响应者

时间:2010-06-09 13:04:54

标签: iphone cocoa-touch uisearchbar

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

由于

4 个答案:

答案 0 :(得分:4)

嗯,刚刚遇到这个非常古老的问题。 您可以启用“取消”#39;按钮开始滚动时按钮如下:

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

}

Swift 4

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

tableView.keyboardDismissMode = .onDrag上添加viewDidLoad()就像是一种魅力。

答案 3 :(得分:0)

我尝试了多个选项,但没有实现所有想要的输出,例如将取消和键盘隐藏在一起。

因此,我使用了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

    }
}