キャンセルボタンのある検索バーがあります。ただし、[キャンセル]ボタンをクリックしても、検索バーは閉じません。キャンセルをクリックすると検索バーが最初の状態に戻るようにするにはどうすればよいですか?
ご質問がある場合は、私に聞いてください
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
}
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.
}
}
やってみて。正常に動作します。
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)
}
}
これを試して:
searchController.active = false
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)
}
非常に迅速かつ簡単。 UISearchBarDelegate
プロトコルに準拠し、クラスにこの関数を実装します。
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
resign
は終了することを意味します
FirstResponder
はビューのフォーカスです
結論として、これは検索バーからフォーカスを奪い、事実上それをキャンセルします。
私もこの問題に遭遇しています。私の場合、テーブルビューからアイテムを検索した後、結果ビューのいずれかをクリックすると詳細ビューが開きますが、検索バーは消えません。私は 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.
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
}
キャンセルボタンをタップすると、searchBar
が新しいものを検索したように見えるので、cancelButton
にresignFirstResponder()
を置いてクリックすると勝ちます動作しません。この後、didBeginText
を呼び出すからです。
そのため、didBeginText
に条件を設定します。そのため、検索の文字列の文字数が0文字以下になると、最初のレスポンダーが辞任します。ちょうどこのような:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.characters.count < 1 {
searchBar.resignFirstResponder()
}
}
それは簡単なアプローチであり、同様に機能します。宜しくお願いします!