使用UISearchBar取消键盘,无需放弃第一响应状态

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

1
哇。哈哈,我使用的教程没有使用searchdisplaycontroller,不知道为什么...使用它可以让它完全符合我的要求。有趣的是,因为我甚至匹配了开始搜索时发生的覆盖层的黑暗感受,但现在它发生了两次,所以变得非常黑暗。 - Mike
4个回答

7

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

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
tableView.keyboardDismissMode = .onDrag添加到viewDidLoad()中,效果非常好。

很不幸,当我尝试这个时,取消按钮仍然保持禁用状态。 - landnbloc

0

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

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接