当我在 Swift 上按下搜索栏时如何关闭键盘?
How to make keyboard dismiss when I press out of searchbar on Swift?
我尝试在 swift 上创建我的搜索栏,但是当我按下搜索栏时,我无法关闭屏幕上的键盘。当我尝试使用文本字段时,它与此代码完美配合。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
当我按下我的文本字段然后键盘消失时它工作。我想用我的搜索栏做这样的事情,因为当我使用搜索栏并使用与文本字段相同的方式时,它根本不起作用。任何参考或代码对我都非常有用。
试试这个:
self.mySearchController.searchBar.endEditing(true)
用您创建的控制器名称替换 mySearchController..
如果您没有以编程方式创建它,而是只是从库中拖出一个搜索栏,那么 IBoutlet 您的可搜索到您的 class 并将其引用为:
self.mySearchBar.endEditing(true)
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
searchProject.resignFirstResponder()
}
当用户单击 keyboard.So 上的搜索按钮时将调用此方法,我们可以忽略 keyboard.I 认为这是正确的方法。
已测试并正常工作!
func searchBarSearchButtonClicked(searchBar: UISearchBar)
{
searchActive = false;
self.mySearchBar.endEditing(true)
}
编辑 Swift 4.2
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
searchActive = false
self.searchBar.endEditing(true)
}
我们可以通过以下方法做到这一点
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = false;
}
首先,苹果的UISearchBarDelegate is the correct solution to hide keyboard when users click a search button while UISearchBar's instance is the first responder
(learn UIResponder). In short, searchBarSearchButtonClicked(_:)就是你完成这个任务所需要的
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder() // hides the keyboard.
doThingsForSearching()
}
如果它不起作用,请检查您的控制器是否符合 UISearchBarDelegate
其次,UISearchBarDelegate
是否了解您的 class 实现(如果您不太了解我在说什么,你应该学习 delegation pattern
开始阅读 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
之外的键盘触摸(用户可能会改变主意search something), UITapGestureRecognizer 也是处理该问题的简单方法。
Ctrl-drag
从 Object Library
到您的视图控制器的 Tap Gesture Recognizer
。
Ctrl-drag
最近从情节提要中的 document outline
添加的 Tap Gesture Recognizer
作为 IBAction
. 到您的 class 实现
- 最后写一段代码:
@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) {
self.yourSearchBar.resignFirstResponder()
}
此外,不要忘记为搜索栏创建 @IBOutlet
,以便在您的 class 实现中进行访问。
以上两种变体在我的项目中都运行良好。
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 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()
}
您可以使用通用的 UIViewController 扩展
- 只需在项目中添加一个新的 swift 文件并粘贴以下代码片段
代码
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() 要隐藏键盘的功能。
我发现使用 Table 查看解雇更容易和更简单。 (如果您使用的是 table 视图)
Swift 4:
self.tableView.keyboardDismissMode = .onDrag
这对我有用 Swift 4
func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
self.searchBar.endEditing(true)
}
我尝试在 swift 上创建我的搜索栏,但是当我按下搜索栏时,我无法关闭屏幕上的键盘。当我尝试使用文本字段时,它与此代码完美配合。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
当我按下我的文本字段然后键盘消失时它工作。我想用我的搜索栏做这样的事情,因为当我使用搜索栏并使用与文本字段相同的方式时,它根本不起作用。任何参考或代码对我都非常有用。
试试这个:
self.mySearchController.searchBar.endEditing(true)
用您创建的控制器名称替换 mySearchController.. 如果您没有以编程方式创建它,而是只是从库中拖出一个搜索栏,那么 IBoutlet 您的可搜索到您的 class 并将其引用为:
self.mySearchBar.endEditing(true)
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
searchProject.resignFirstResponder()
}
当用户单击 keyboard.So 上的搜索按钮时将调用此方法,我们可以忽略 keyboard.I 认为这是正确的方法。
已测试并正常工作!
func searchBarSearchButtonClicked(searchBar: UISearchBar)
{
searchActive = false;
self.mySearchBar.endEditing(true)
}
编辑 Swift 4.2
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
searchActive = false
self.searchBar.endEditing(true)
}
我们可以通过以下方法做到这一点
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = false;
}
首先,苹果的UISearchBarDelegate is the correct solution to hide keyboard when users click a search button while UISearchBar's instance is the first responder
(learn UIResponder). In short, searchBarSearchButtonClicked(_:)就是你完成这个任务所需要的
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder() // hides the keyboard.
doThingsForSearching()
}
如果它不起作用,请检查您的控制器是否符合 UISearchBarDelegate
其次,UISearchBarDelegate
是否了解您的 class 实现(如果您不太了解我在说什么,你应该学习 delegation pattern
开始阅读 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
之外的键盘触摸(用户可能会改变主意search something), UITapGestureRecognizer 也是处理该问题的简单方法。
Ctrl-drag
从Object Library
到您的视图控制器的Tap Gesture Recognizer
。
Ctrl-drag
最近从情节提要中的document outline
添加的Tap Gesture Recognizer
作为IBAction
. 到您的 class 实现
- 最后写一段代码:
@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) {
self.yourSearchBar.resignFirstResponder()
}
此外,不要忘记为搜索栏创建 @IBOutlet
,以便在您的 class 实现中进行访问。
以上两种变体在我的项目中都运行良好。
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 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()
}
您可以使用通用的 UIViewController 扩展
- 只需在项目中添加一个新的 swift 文件并粘贴以下代码片段
代码
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() 要隐藏键盘的功能。
我发现使用 Table 查看解雇更容易和更简单。 (如果您使用的是 table 视图)
Swift 4:
self.tableView.keyboardDismissMode = .onDrag
这对我有用 Swift 4
func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
self.searchBar.endEditing(true)
}