37

インターフェイスに UISearchBar があり、テキストが入力された後に検索バーに表示される小さなクリア ボタンの動作をカスタマイズしたい (十字の付いた小さな灰色の円で、右側に表示される)検索フィールドの側面)。

基本的に、検索バーのテキスト (デフォルトの実装) をクリアするだけでなく、インターフェイスから他のものもクリアする必要がありますが、独自のメソッドの 1 つを呼び出します。

UISearchBar クラスまたは UISearchBarDelegate プロトコルのドキュメントには何も見つかりません。この動作に直接アクセスできるようには見えません。

私が注意したことの1つは、ドキュメントがデリゲートメソッドについて次のように説明していたことです。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

クリアボタンがタップされた後に呼び出されます。

最初に、検索バーのテキスト プロパティをチェックするコードをそのメソッドに書きました。空の場合はクリアされ、他のすべてのことを実行します。

ただし、これには2つの問題があります:

まず、何らかの理由で、メソッドの最後で検索バーに rejectFirstResponder を指示しても、どこかがそれをbecomeFirstResponderに戻しています。本当に忌々しい...

第 2 に、ユーザーがクリア ボタンを使用せず、キーボードの削除ボタンを使用してバー内のテキストを単純に削除すると、このメソッドが起動され、検索結果が消えます。良くない。

正しい方向へのアドバイスや指針は素晴らしいでしょう!

ありがとう!

4

9 に答える 9

18

この問題のより良い解決策を見つけました:)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if ([searchText length] == 0) {
        [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0];
    }
}

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{   
    [searchBar resignFirstResponder];   
}
于 2014-04-08T21:12:42.393 に答える
12

受け入れられた答えは正しくありません。これを行うことができます。私はそれを理解し、別の質問に投稿しました:

UISearchbar clearButton はキーボードを強制的に表示します

一番

于 2010-10-04T02:38:19.100 に答える
7

アプリにこのコードがあります。違いは、「ライブ検索」をサポートしていないことですが、代わりに、ユーザーがキーボードの検索ボタンに触れたときに検索を開始します。

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    if ([searchBar.text isEqualToString:@""]) {
        //Clear stuff here
    }
}
于 2010-02-10T13:19:30.590 に答える
7

クリアボタンのクリックでキーボードを閉じるSwiftバージョンの処理:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count == 0 {
        performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0)
    }
}

func hideKeyboardWithSearchBar(bar:UISearchBar) {
    bar.resignFirstResponder()
}
于 2015-11-25T12:15:40.230 に答える
1

rightViewUITextField の メソッドとrightViewModeメソッドを使用して、同じ画像を使用する独自のクリア ボタンを作成することをお勧めします。もちろん、UISearchBar を使用すると、その中の UITextField にアクセスできると想定しています。そうなると思います。
iPhone OS Reference Library からこれに注意してください。

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

そのため、おそらく元のクリア ボタンも無効にする必要があります。

于 2010-01-26T07:47:03.893 に答える
1

これが最初に出てくるので、私が見ることができる限り、質問は実際には適切に対処されていなかったので、解決策を投稿すると思いました.

1) searchBar 内の textField への参照を取得する必要があります。2) 起動時にその textField のクリアをキャッチする必要があります。

これはとても簡単です。これが1つの方法です。

a) searchBar 内で textField のデリゲート メソッドを使用するため、必ずクラスを a にしてください。b) また、searchBar をクラスの Outlet に接続します。私は自分のsearchBarを呼び出しました。c) viewDidLoad から、searchBar 内の textField を取得します。私はこのようにしました。

UITextField *textField = [self.searchBar valueForKey:@"_searchField"];
if (textField) {
    textField.delegate = self;
    textField.tag = 1000;
}

もう一度取得できるように、その textField にタグを割り当て、それを textField デリゲートにしたことに注意してください。プロパティを作成し、この textField をそのプロパティに割り当てて後で取得することもできましたが、ここではタグを使用しました。

ここからデリゲート メソッドを呼び出すだけです。

-(BOOL)textFieldShouldClear:(UITextField *)textField {
if (textField.tag == 1000) {
    // do something
    return YES;
}
return NO;

}

それでおしまい。プライベートな valueForKey を参照しているため、トラブルに巻き込まれないことを保証することはできません。

于 2013-12-13T23:00:26.503 に答える
0

ここでは、プライベート API を使用していない、または Apple が UISearchBar のビュー構造を変更した場合に備えてアップグレードの保証がないソリューションを見つけることができませんでした。これが私が書いたものです。

- (void)viewDidLoad {
    [super viewDidLoad];

    UITextField* textfield = [self findTextFieldInside:self.searchBar];
    [textfield setDelegate:self];
}

- (UITextField*)findTextFieldInside:(id)mainView {
    for (id view in [mainView subviews]) {
        if ([view isKindOfClass:[UITextField class]]) {
            return view;
        }

        id subview = [self findTextFieldInside:view];
        if (subview != nil) {
            return subview;
        }
    }

    return nil;
}

次に、UITextFieldDelegate プロトコルをクラスに実装し、textFieldShouldClear: メソッドを上書きします。

- (BOOL)textFieldShouldClear:(UITextField*)textField {
    // Put your code in here.
    return YES;
}

編集: iOS8 の検索バーのテキスト フィールドにデリゲートを設定すると、クラッシュが発生します。ただし、searchBar:textDidChange: メソッドはクリア時に iOS8 で呼び出されるようです。

于 2014-10-03T13:44:33.870 に答える