web-dev-qa-db-ja.com

[キャンセル]ボタンをクリックして検索を終了する方法は?

キャンセルボタンのある検索バーがあります。ただし、[キャンセル]ボタンをクリックしても、検索バーは閉じません。キャンセルをクリックすると検索バーが最初の状態に戻るようにするにはどうすればよいですか?

ご質問がある場合は、私に聞いてください

18
John Doe

UISearchBarDelegateを実装する必要があります。

class ViewController: UIViewController, UISearchBarDelegate {
    @IBOutlet weak var searchBar: UISearchBar!

検索バーのデリゲートをselfに設定します

 override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.showsCancelButton = true
        searchBar.delegate = self

次に、butCancelSearchActionデリゲート関数を実装して、検索アクションをキャンセルして検索テキストをリセットするために必要なことをすべて実行します。

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    // Do some search stuff
}

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    // Stop doing the search stuff
    // and clear the text in the search bar
    searchBar.text = ""
    // Hide the cancel button
    searchBar.showsCancelButton = false
    // You could also change the position, frame etc of the searchBar 
}
46
Peter Todd
class MyController: UIViewController, UISearchBarDelegate {
    // Called when search bar obtains focus.  I.e., user taps 
    // on the search bar to enter text.
    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.showsCancelButton = false

        // Remove focus from the search bar.
        searchBar.endEditing(true)

        // Perform any necessary work.  E.g., repopulating a table view
        // if the search bar performs filtering. 
    }
}
10
orangemako

やってみて。正常に動作します。

class MyViewController: UIViewController, UISearchBarDelegate {

    func searchBarTextDidBeginEditing(_searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(true, animated: true)
        //write other necessary statements
    }

    func searchBarCancelButtonClicked(_searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.setShowsCancelButton(false, animated: true)

        // Remove focus from the search bar.
        searchBar.endEditing(true) 
    }
} 
6
mumu

これを試して:

searchController.active = false
3
Nijat Rzayev

UISearchBarDelegateを実装する必要があります。

UISearchBarDelegateプロトコルは、UISearchBarコントロールを機能させるために実装するオプションのメソッドを定義します。 UISearchBarオブジェクトは、バーの検索フィールドにユーザーインターフェイスを提供しますが、ボタンがタップされたときにアクションを実装するのはアプリケーションの責任です。少なくとも、delegateにテキストが入力されると、textFieldは実際の検索を実行する必要があります。 これを読む

Objective Cで

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {

     [self.searchDisplayController setActive:NO animated:YES];

}

In Swift:

func searchBarCancelButtonClicked(searchBar: UISearchBar) {

    self.searchDisplayController.setActive(false, animated: true)
}
2
Mayank Patel

非常に迅速かつ簡単。 UISearchBarDelegateプロトコルに準拠し、クラスにこの関数を実装します。

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}

resignは終了することを意味します

FirstResponderはビューのフォーカスです

結論として、これは検索バーからフォーカスを奪い、事実上それをキャンセルします。

2
George_E

私もこの問題に遭遇しています。私の場合、テーブルビューからアイテムを検索した後、結果ビューのいずれかをクリックすると詳細ビューが開きますが、検索バーは消えません。私は Nicatの答え を少し変更して使用します。ここに私のバージョンがあります:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    searchController.isActive = false
    self.searchBarCancelButtonClicked(searchController.searchBar)

    ...
}

スイフト3

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsCancelButton = true
    return true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.resignFirstResponder()
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.showsCancelButton = false
    searchBar.resignFirstResponder()
}

The Cancel button appears only when the user start entering characters in the field.
2
Manu

Objective-Cソリューションの場合

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {

    if(@available(iOS 11.0, *)){
        [self.navigationController.navigationItem.searchController.searchBar resignFirstResponder];
    }
    // reload your table or whatever you want.
    // searchController is available after the iOS 11, so it will be good to use @available check
}
0
elia

キャンセルボタンをタップすると、searchBarが新しいものを検索したように見えるので、cancelButtonresignFirstResponder()を置いてクリックすると勝ちます動作しません。この後、didBeginTextを呼び出すからです。

そのため、didBeginTextに条件を設定します。そのため、検索の文字列の文字数が0文字以下になると、最初のレスポンダーが辞任します。ちょうどこのような:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count < 1 {
        searchBar.resignFirstResponder()
    }
}

それは簡単なアプローチであり、同様に機能します。宜しくお願いします!

0
Hackbarth