1

私は検索機能を備えた iPhone アプリに取り組んでおり、UISearchBar に検索語を書き込むと、以下の UITabelView の出力が変更 (フィルター) されます。

ユーザーが検索バーのコンテンツを編集中にすべてのテキストを削除すると、次のコードが実行されます。

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

  if([searchText isEqualToString:@""] || searchText==nil){

    [tableData removeAllObjects]; //clear array that holds data for table view
    [tableData addObjectsFromArray:tumorNames]; //load array with database
    [searchTableView reloadData];
    return;
    }
}

(method continues...)

今、これは検索バー内で編集するときに問題なく機能します。バックスペース/削除ですべてのテキストを削除するか、「クリア」ボタンを押すかは関係ありません-検索フィールドがクリアされ、検索可能なすべてのアイテムがテーブルに表示されます見る。「キャンセル」ボタンを押しても同じことが言えますが、この場合、もちろん、検索バーはファーストレスポンダを辞任します。

ただし、検索が行われ、1 つ以上の結果項目がテーブル ビューに表示されている場合 (検索バーが最初のレスポンダーを辞任し、キーボードがなくなった場合)、クリア ボタンを押すことは引き続き可能ですが、次のようにアプリがクラッシュします。メッセージ:

'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'

問題はテーブルビューデータの再読み込みにあるようですが、配列のインデックスに問題がある場合とそうでない場合がある理由がわかりません。

なぜこれが起こるのか誰にも分かりますか?すべての助けに感謝します。

グレゴール、スウェーデン

4

3 に答える 3

2

クリアボタンがクリックされると、デリゲートメソッド

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar

メソッドのに呼び出される

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

これは奇妙に思えるかもしれませんが、私の問題を説明しています: 前の方法でテーブル ビューのデータを保持している配列をフラッシュすると (最後の検索をクリアするため)、テーブル ビューがそれから読み取ろうとするとエラーが発生します。

問題は解決しました。この情報が他の人に役立つことを願っています。

ここで必要なのは、キャンセル ボタンがクリックされたときに検索バーがファーストレスポンダーにならないようにすることだけです。誰でもこれを行う方法を知っていますか?

グレゴール、スウェーデン

于 2009-09-01T23:09:52.043 に答える
1
(void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
        ... 
        [searchBar becomeFirstResponder]; 
 [self.tableView reloadData];
于 2009-11-21T21:33:53.750 に答える
0

検索フィールドに が含まれているが配列が含まれている場合は、オーバーライド- (BOOL)acceptsFirstResponderして返すことができます。私はそれがうまくいくと思います。NO@""!= nil

于 2009-11-06T22:40:59.480 に答える