web-dev-qa-db-ja.com

Swiftの検索バーの外を押したときにキーボードを閉じるにはどうすればよいですか?

私はSwiftで検索バーを作成しようとしましたが、検索バーを押したときに画面上のキーボードを閉じる問題があります。私がテキストフィールドで試してみると、このコードで完璧に動作します。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }   

テキストフィールドの外を押してからキーボードが消えると動作します。検索バーを使用してテキストフィールドと同じ方法を使用すると、まったく機能しないため、検索バーでそのようにしたいと思います。参照やコードは私にとって非常に役立ちます。

44
aji

これを試して :

self.mySearchController.searchBar.endEditing(true)

mySearchControllerを作成したコントローラー名に置き換えます。プログラムで作成したのではなく、ライブラリから検索バーをドラッグしただけの場合、IBoutletを検索可能クラスに追加し、次のように参照します。

self.mySearchBar.endEditing(true)
61
Koray Birand

テスト済みで動作中!

func searchBarSearchButtonClicked(searchBar: UISearchBar) 
{
    searchActive = false;
    self.mySearchBar.endEditing(true)
}

Swift 4.2の編集

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
    {
        searchActive = false
        self.searchBar.endEditing(true)
    }
19
Thiago Arreguy
 func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        searchActive = false;
        searchProject.resignFirstResponder()
    }

ユーザーがキーボードの検索ボタンをクリックすると、このメソッドが呼び出されます。ここで、キーボードを閉じることができます。これが正しいメソッドだと思います。

8
user3962845

まず、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 もそれを処理する簡単な方法です。

  1. _Ctrl-drag_ a _Tap Gesture Recognizer_から_Object Library_からView Controllerへ。

enter image description here

  1. _Ctrl-drag_最近追加された_Tap Gesture Recognizer_は、ストーリーボードの_document outline_からIBActionとしてクラス実装に追加されます。

enter image description here

  1. 最後に、コードを記述します。

@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) { self.yourSearchBar.resignFirstResponder() }

また、create_@IBOutlet_を忘れずに、クラス実装内で検索バーにアクセスしてください。

上記の両方のバリアントは私のプロジェクトでうまく機能します。

6
Ivan Shokurov

Table Viewを使用して解雇する方が簡単かつ簡単であることがわかりました。 (テーブルビューを使用している場合)

Swift 4:

self.tableView.keyboardDismissMode = .onDrag
4
Dominic Smith

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()
}
4

一般的な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)
        }
    }
 }
  1. 今すぐ呼び出しhideKeyboardWhenTappedAround() fromviewDidLoadメソッド
0
dip
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)
    }
}

これは私にとって非常にうまくいきます。

0
XenoX

これはSwift 4で動作します

   func searchBarSearchButtonClicked(_ searchBar: UISearchBar){

    self.searchBar.endEditing(true)

    }
0
nanospeck

次の方法でこれを行うことができます

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true;
    }

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = false;
    }
0
rak