makoラボ

日常や勉強会や技術ネタ

UISearchBarが空の状態でも検索ボタンを有効にする

f:id:mako_wis:20140309195642p:plain

UISearchBarはデフォルトの設定では、入力が空の状態ではキーボードの検索ボタンが無効になってしまいます。 でも、入力が空の状態でもキーボードの検索ボタンを有効にしたい場合があると思います。

今回はコード側で設定する方法について書いていこうと思います。

実装方法

UISearchBarに検索ボタンの有効・無効の設定項目は無く、UISearchBarの中にあるUITextFieldに設定があります。ですのでまずはUISearchBarの中のUITextFieldを取得する必要があります。

その後、取得したUITextFieldに対して検索ボタンの有効・無効の切り替えプロパティの設定を行います。

以下に順番に実装方法を書いていきます。

UISearchBarの中のUITextFieldの取得

// UISearchBar内のUITextFieldを取得する
- (UITextField *)getTextFieldFromView:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            return (UITextField *)subview;
        } else {
            UITextField *textField = [self getTextFieldFromView:subview];
            if (textField) {
                return textField;
            }
        }
    }
    return nil;
}

上記のメソッドの引数にUISearchBarを渡して、UITextFieldを取得します。再帰構造にしているのはUISarchBarの直下のSubViewより深い階層にUITextFieldが設定されているためです。

プロパティの設定

// UISeachBar(self.searchBar)の検索ボタンを常に有効にする
[self getTextFieldFromView:self.searchBar].enablesReturnKeyAutomatically = NO;

上記のように取得したUITextFieldのリターンキーの自動有効・無効設定を切りに指定します。

おわり

ほんとはStoryboard上の設定ですべてを終わらせたいのですが、無いようなので今回のようなコード側での実装を行っています(あるよお前の目は節穴か!とい場合は是非教えて下さい。)

また、iOS6以前だとUISearchBar直下のSubViewの階層にUITextFieldがあったようなのですが、iOS7からは更に深い階層に潜っているようです。。。やっぱりStoryboardで設定したい。。。そもそもそういう使い方が良くないのかな。