5

わかりました、私はこれで髪を引っ張っています。これもある時点で機能していたことはほぼ確実ですが、現在は機能していません。

UISearchBarテーブルビューセルに埋め込まれています。プロパティとして宣言された検索バーがあり、View Controller は として設定されていUISearchBarDelegateます。検索バーが初期化され、構成され、すべてが見栄えがします。他のデリゲート メソッドに応答して、入力された文字を制限し、キャンセル ボタンを処理し、searchBarSearchButtonClicked. 私は一体何を間違っているのですか?

これが私のセットアップの基本です:

ViewController.h

    @interface SearchMLSNumberViewController : UIViewController <UISearchBarDelegate>

    @property (strong, nonatomic) UISearchBar *searchField;

ViewController.m

// viewDidLoad
// init the search bar
self.searchField = [[UISearchBar alloc] init];
self.searchField.delegate = self;
self.searchField.autocorrectionType = UITextAutocorrectionTypeNo;
self.searchField.placeholder = NSLocalizedString(@"Search", @"Search");

// in my cell setup
CGRect frame = cell.contentView.frame;
[self.searchField setFrame:frame];
[cell.contentView addSubview:self.searchField];

// here is the delegate call that never fires for me
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSLog(@"search button pressed");
}

テーブルビューの設定をすべて除外しましたが、すべて正常に機能しているようです。それが私を殺しているのです。すべてが正常に機能しており、他のすべてのデリゲート メソッドは... 検索ボタンが返されることを除きます。私が愚かなことをしていると言ってください。私には選択肢がありません。

UPDATE 検索ボタンが実行に失敗する理由の原因を突き止めました。他のすべての検索バー デリゲート メソッドを削除したところ、機能し始めました...そのため、どれが問題を引き起こしているかがわかるまで、それらをすべてコメントアウトしました。

この男は私の犯人です:

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}

では、検索ボタンは実際にキーの押下としてカウントされ、許可された文字に追加する必要がありますか? それとも、返品できるようにチェックを追加する必要がありますか? どんな助けでも素晴らしいでしょう。

更新 2 問題を解決しました。手がかりと啓示の組み合わせが必要でしたが、ついに機能しました。犯人は、文字セットでリターン キーを許可していませんでした。文字セットに \n を追加すると、検索ボタンが正しく機能しませんでした。これは、追加された return キーと、私の状況で有効な文字セットを示す、更新されたフィルター ロジックです。許可されたら、自分でこれに答えます。

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-\n"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}
4

1 に答える 1

12

ここで自分の質問に答えているので、締めくくることができます。質問をした直後にこの問題を解決しました。それがどのように機能するかおかしい。回答は他のユーザーに関連しているため、後世のために回答を更新します。

tl;dr では、リターン キーを許可していませんでした-shouldChangeTextInRange。入力できる文字セットが限られていましたが、有効な文字としてリターン キーを含めるのを忘れていました。

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ,-\n"] invertedSet];
    NSString *filtered = [[text componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
    return [text isEqualToString:filtered];
}

これは、テキスト フィールド内の文字も制限している場合にも影響を与える可能性があります。それが私が私の問題を解決した方法です。どれが私をブロックしているのかがわかるまで、すべてのデリゲート メソッドを削除することから始めました。自分が何をしているのかを理解したら、テキスト フィールドの問題を検索してリターン キーを突き止めました。検索バーにはあまり問題がなかったので、この質問をすることになりました。質問をせずにこれを理解したかもしれませんが、少なくとも何かを学んだので、この答えが将来誰かに役立つことを願っています.

また、文字を制限するためのより良い方法と、コード ベースの全体的な健全性について考えるためのアドバイスをくれた @mattt に感謝します。

于 2013-11-16T04:50:52.073 に答える