当我在 Swift 上按下搜索栏时如何使键盘消失?
Posted
技术标签:
【中文标题】当我在 Swift 上按下搜索栏时如何使键盘消失?【英文标题】:How to make keyboard dismiss when I press out of searchbar on Swift? 【发布时间】:2015-07-07 15:43:30 【问题描述】:我尝试在 swift 上创建我的搜索栏,但是当我按下搜索栏时,我无法关闭屏幕上的键盘。当我尝试使用 textfield 时,它与此代码完美配合。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
self.view.endEditing(true)
当我按下我的文本字段然后键盘消失时它会起作用。我想用我的搜索栏做到这一点,因为当我使用搜索栏并使用与文本字段相同的方式时,它根本不起作用。任何参考或代码对我来说都非常有用。
【问题讨论】:
您可以在下面的链接中找到答案:***.com/questions/24908966/… 我试过了,所以我得到了我的文本字段代码,它像我说的那样工作得很好,但是当我必须使用搜索栏时我遇到了一些问题,因为我不能让我的键盘关闭当我触摸搜索栏外的另一个区域时 【参考方案1】:试试这个:
self.mySearchController.searchBar.endEditing(true)
将 mySearchController 替换为您创建的控制器名称.. 如果您没有以编程方式创建它,而只是从库中拖动了一个搜索栏,那么 IBoutlet 您的可搜索到您的类并将其引用为:
self.mySearchBar.endEditing(true)
【讨论】:
你能给我任何线索吗?如何在我的搜索栏外点击时获取事件,因为当我使用文本字段时,我会使用我之前写的功能,当我在我的外部点击时它会自动获取事件文本域。你能帮我在搜索栏中有这样的功能吗 您是从库中将它拖到情节提要中还是从类的内部创建的......? 我把它从我的故事板上拖了出来 我认为您的解决方案很好。但是我想知道当我在搜索栏外单击时会发生什么事件。如果我知道该事件,那么我可以将您的建议纳入其中,它应该可以工作。 我假设您在搜索栏下使用的是表格视图或集合视图。他们都有解除键盘复选框。你可以使用它们。【参考方案2】: func searchBarSearchButtonClicked(searchBar: UISearchBar)
searchActive = false;
searchProject.resignFirstResponder()
当用户点击键盘上的搜索按钮时将调用此方法。所以这里我们可以关闭键盘。我认为这是正确的方法。
【讨论】:
【参考方案3】:经过测试并且可以正常工作!
func searchBarSearchButtonClicked(searchBar: UISearchBar)
searchActive = false;
self.mySearchBar.endEditing(true)
为 Swift 4.2 编辑
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
searchActive = false
self.searchBar.endEditing(true)
【讨论】:
【参考方案4】:我们可以通过以下方法做到这一点
func searchBarTextDidBeginEditing(searchBar: UISearchBar)
searchBar.showsCancelButton = true;
func searchBarTextDidEndEditing(searchBar: UISearchBar)
searchBar.showsCancelButton = false;
【讨论】:
【参考方案5】:首先,Apple 的UISearchBarDelegate 是当用户单击搜索按钮时隐藏键盘的正确解决方案,而UISearchBar 的实例是first responder
(了解UIResponder)。简而言之,searchBarSearchButtonClicked(_:) 是您完成这项任务所需要的。
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
searchBar.resignFirstResponder() // hides the keyboard.
doThingsForSearching()
如果它不起作用,请检查您的控制器是否符合UISearchBarDelegate
,其次,UISearchBarDelegate
是否知道您的类实现(如果您不太明白我在说什么,您应该学习@ 987654335@开始阅读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
之外的键盘触摸(用户可能会改变主意搜索某些内容),@ 987654326@ 也是一种简单的处理方法。
Ctrl-drag
Tap Gesture Recognizer
从 Object Library
到您的视图控制器。
Ctrl-drag
最近从情节提要中的document outline
添加到您的类实现中的Tap Gesture Recognizer
为IBAction
。
-
最后,写一段代码:
@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer)
self.yourSearchBar.resignFirstResponder()
另外,不要忘记创建 @IBOutlet
以便搜索栏可以访问您的类实现。
以上两种变体都在我的项目中运行良好。
【讨论】:
【参考方案6】: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 5)。谢谢!【参考方案7】: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()
【讨论】:
【参考方案8】:你可以使用通用的 UIViewController 扩展
-
只需在项目中添加一个新的swift文件,粘贴以下代码sn -p
代码
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() 您想要键盘隐藏功能。
【讨论】:
【参考方案9】:我发现使用表格视图进行解雇更容易和更简单。 (如果您使用的是表格视图)
斯威夫特 4:
self.tableView.keyboardDismissMode = .onDrag
【讨论】:
我什至不知道这存在,感谢分享 Dominic,工作就像一个魅力和一个很好的补充,还通过搜索按钮退出键盘。 这应该是公认的答案。顺便说一句,iPhone 上的联系人应用程序似乎正是使用这种模式。【参考方案10】:这适用于 Swift 4
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
self.searchBar.endEditing(true)
【讨论】:
你为什么要使用“self”——活动的 searchBar 对象被传递到这个委托的方法中。 “searchBar.endEditing(true)” 工作得很好。使用 self,您正在引用您的外部声明(可能是也可能不是同一个实例)。以上是关于当我在 Swift 上按下搜索栏时如何使键盘消失?的主要内容,如果未能解决你的问题,请参考以下文章