嘿,我正在开发一个类似于联系人应用的基于导航的iPhone应用。当您在搜索栏中输入内容并在表格中滚动时(在联系人应用中),键盘会消失。我不认为它首先放弃响应者,因为当我尝试在-(void)scrollViewDidScroll:(UIScrollView *)scrollView中这样做时,它会禁用取消按钮,而这在联系人应用中不会发生。我的问题基本上是如何在不禁用取消按钮的情况下关闭键盘,就像在联系人应用中一样?
谢谢
谢谢
好的,刚刚遇到了这个非常古老的问题。 您可以按以下方式在滚动开始时启用“取消”按钮:
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
}
tableView.keyboardDismissMode = .onDrag
添加到viewDidLoad()
中,效果非常好。https://developer.apple.com/library/ios/#samplecode/TableSearch/Introduction/Intro.html
我尝试了多种选项,但都没有实现所需的输出,例如隐藏取消按钮以及键盘。
因此,我使用了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
}
}