私はSwiftで検索バーを作成しようとしましたが、検索バーを押したときに画面上のキーボードを閉じる問題があります。私がテキストフィールドで試してみると、このコードで完璧に動作します。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
テキストフィールドの外を押してからキーボードが消えると動作します。検索バーを使用してテキストフィールドと同じ方法を使用すると、まったく機能しないため、検索バーでそのようにしたいと思います。参照やコードは私にとって非常に役立ちます。
これを試して :
self.mySearchController.searchBar.endEditing(true)
mySearchControllerを作成したコントローラー名に置き換えます。プログラムで作成したのではなく、ライブラリから検索バーをドラッグしただけの場合、IBoutletを検索可能クラスに追加し、次のように参照します。
self.mySearchBar.endEditing(true)
テスト済みで動作中!
func searchBarSearchButtonClicked(searchBar: UISearchBar)
{
searchActive = false;
self.mySearchBar.endEditing(true)
}
Swift 4.2の編集
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
searchActive = false
self.searchBar.endEditing(true)
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchActive = false;
searchProject.resignFirstResponder()
}
ユーザーがキーボードの検索ボタンをクリックすると、このメソッドが呼び出されます。ここで、キーボードを閉じることができます。これが正しいメソッドだと思います。
まず、Appleの ISearchBarDelegate は、ユーザーが ISearchBar の間に検索ボタンをクリックしたときにキーボードを非表示にする正しいソリューションです=のインスタンスは_first responder
_(学習 IResponder )です。つまり、このタスクに必要なものは searchBarSearchButtonClicked(_:) です。
_func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder() // hides the keyboard.
doThingsForSearching()
}
_
動作しない場合は、チェックして、コントローラーがUISearchBarDelegate
に準拠しているか、次にUISearchBarDelegate
がクラスの実装について知っているか(私が話していることをよく理解していない場合は、 _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
_の外側に触れるキーボードを非表示にする必要がある場合何かを検索するように彼の心を変えるかもしれません)、 ITapGestureRecognizer もそれを処理する簡単な方法です。
Ctrl-drag
_ a _Tap Gesture Recognizer
_から_Object Library
_からView Controllerへ。Ctrl-drag
_最近追加された_Tap Gesture Recognizer
_は、ストーリーボードの_document outline
_からIBAction
としてクラス実装に追加されます。@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) { self.yourSearchBar.resignFirstResponder() }
また、create_@IBOutlet
_を忘れずに、クラス実装内で検索バーにアクセスしてください。
上記の両方のバリアントは私のプロジェクトでうまく機能します。
Table Viewを使用して解雇する方が簡単かつ簡単であることがわかりました。 (テーブルビューを使用している場合)
Swift 4:
self.tableView.keyboardDismissMode = .onDrag
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)
セレクターfuncでは、self.searchBar.resignFirstResponder
を呼び出します
@objc func singleTap(sender: UITapGestureRecognizer) {
self.searchBar.resignFirstResponder()
}
一般的なUIViewController拡張を使用できます 1.拡張ファイルを作成し、次のコードスニペットを貼り付けるだけです
Swift 4
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)
}
}
}
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で動作します
func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
self.searchBar.endEditing(true)
}
次の方法でこれを行うことができます
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = false;
}