web-dev-qa-db-ja.com

UISearchBarのキャンセルボタンを非表示

私のnibからアウトレット経由でViewControllerに接続されたUISearchDisplayControllerとUISearchBarがあります。

キャンセルボタンを非表示にして、ユーザーに表示されないようにしたい。問題は、次のコードがボタンを非表示にすることですが、ボタンをユーザーに1秒間表示した後でのみです(たとえば、シミュレーターとデバイスで点滅し、表示されなくなります)。

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{
    controller.searchBar.showsCancelButton = NO;
}

それを隠すより良い方法はありますか?

28
ArtSabintsev

UISearchBarをサブクラス化して「キャンセル」ボタンを非表示にし、このメソッドをオーバーライドしました。

-(void)layoutSubviews{
    [super layoutSubviews];
    [self setShowsCancelButton:NO animated:NO];
}
37
Nim Gat

同じ問題がありましたが、別の方法で修正しました。

UISearchDisplayControllerをサブクラス化できない、またはしたくない人のために、UIKeyboardWillShowNotificationにリスナーを追加し、そこに[self setShowsCancelButton:NO animated:NO]を設定することで問題を修正しました。

viewWillAppear:

// Add keyboard observer:
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillAppear:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

次に、以下を作成します。

- (void)keyboardWillAppear:(NSNotification *)notification
{
    [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO];
}

追加することを忘れないでください、

[[NSNotificationCenter defaultCenter] removeObserver:self];

viewWillDisappear:

お役に立てれば!

15
BFeher

Nimrodの回答と同様に、UISearchDisplayControllerをサブクラス化し、setActive:animated:メソッドを実装することもできます。

- (void)setActive:(BOOL)visible animated:(BOOL)animated {
    [super setActive:visible animated:animated];
    self.searchBar.showsCancelButton = NO;
}
8
quantumkid

これはXcode内のバグのようです。私はこのエラーをAppleのバグ報告サイトに提出しましたが、彼らはフォローアップしてサンプルコードとユースケースの追加を求めてきました。

この問題を解決してくれてありがとうございます。

6
ArtSabintsev
class CustomSearchBar: UISearchBar {

    override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) {
        super.setShowsCancelButton(false, animated: false)
    }

}

class CustomSearchController: UISearchController, UISearchBarDelegate {

    lazy var _searchBar: CustomSearchBar = {
        [unowned self] in
        let customSearchBar = CustomSearchBar(frame: CGRectZero)
        customSearchBar.delegate = self
        return customSearchBar
    }()

    override var searchBar: UISearchBar {
        get {
            return _searchBar
        }
    }

}
3
Harris

UISearchBarUISearchControllerとともに使用すると、この問題が発生しました。私は自分のキャンセルボタンをキャンセルボタンとして使用しています iPadでは表示されませんでした with showsCancelButton = YES、今はiPhoneでshowsCancelButton = NOで非表示になりません!

以下は私のために働いた。

デリゲートと初期値を設定します。

- (void)viewDidLoad
{
    // ... 
    self.searchController.searchBar.showsCancelButton = NO;
    self.searchController.searchBar.delegate = self;
}

テキストバーが編集を開始してからshowsCancelButtonNO 0.1秒にリセットします。

#pragma mark - UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.searchController.searchBar.showsCancelButton = NO;
    });
}
3
William Denniss

サブクラス化を避けたい場合は実装

searchController.searchBar.showsCancelButton = false;

これらの2つのデリゲートメソッド内(デリゲートを割り当てることを忘れないでください):

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

- (void)didPresentSearchController:(UISearchController *)searchController

1つ目はsearchBarを更新するたびに呼び出され(デフォルトでは[キャンセル]ボタンが表示されます)、2つ目は最初のsearchBarのアクティブ化用です。

2
Jakub Truhlář

IOS8で非推奨となったUISearchDisplayControllerの後、Appleハンドル検索表示をUISearchControllerDelegateに与えます。

以下のように、searchBarをオーバーライドして[キャンセル]ボタンを非表示にすることができます。

- (void)didPresentSearchController:(UISearchController *)searchController {
    [searchController.searchBar setShowsCancelButton:NO];
}

非アクティブ状態から非表示の[キャンセル]ボタンが必要な場合は、initにsearchBarを設定する必要があります。

search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];
0
ihsan_husnul

私が以前に経験した問題に基づいて、それを設定しようとしたことがあります:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

これが場違いである場合、申し訳ありませんが質問でこの質問をする方法がわかりません。

0
jamesC

検索バーの検索フィールドの編集中にキャンセルボタンが表示された場合は、次の操作を実行できます。検索バーをサブクラス化し、UITextFieldDelegateprotocolを実装します。

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

次にtextFieldDidBeginEditing:を実装し、次のようにします。

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [self setShowsCancelButton:self.cancelButtonShown animated:NO];
}

これにより、キャンセルボタンが表示されなくなります。

0
Don Miguel