3

NSFetchedResultsControllerを検索するためのこの完璧な答えを見つけました:https ://stackoverflow.com/a/4481896/1486928

編集:問題を示すプロジェクト:http://cl.ly/2x0C0N0E4240

ARCで使用するように作成されていないことを除けば、本当にすばらしいようです。「保持」、「解放」、「自動解放」をすべて削除しようとしました。

それでも機能しますが、ほとんどの場合、検索バーに文字を入力すると、期待どおりにフィルター処理されたテーブルが表示されますが、1文字しか必要ありません(さらに追加しても何も起こりません)。 「検索」は、1文字しか使用しなかった最初の検索の結果を表示します。

私は2日間、NSlogをどこにでも置いて、すべてのメソッドがいつ呼び出されるかを確認しましたが、それでもそれを機能させる方法を見つけることができませんでした:(

ありがとう !

編集:ここに.m http://pastebin.com/9U4TfbA6 編集:ここに.hhttp: //pastebin.com/S9aaNRFE

また、私がこれにコメントするときに検索が機能するのを助けることができるなら:

- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController_! = nil)
    {
        return fetchedResultsController_;
    }
...
}

この :

- (NSFetchedResultsController *)searchFetchedResultsController { 
    if (searchFetchedResultsController_ != nil)
    {
        return searchFetchedResultsController_;
    }
...
}

しかし、それは他のものを台無しにします:/

4

1 に答える 1

3

検索表示コントローラーのデリゲート メソッドを台無しにしていると思いますが、

特に、このメソッドを確認する必要があります

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;

このメソッドは、名前自体が示すように、検索フィールドに入力するすべての文字に対してテーブル ビューをリロードするためです。shouldReloadTableForSearchString

編集:

2 つのデリゲート メソッドを実装する必要があるのはUISearchBar、すべてのUISearchDisplayControllerデリゲート メソッドが同じであり、これらの 2 つのメソッドが

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

これは、ユーザーが検索テキストを変更したことをデリゲートに伝えます。

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

これは、指定された範囲内のテキストを特定のテキストに置き換える必要がある場合に使用されます。

これらのメソッドは数回呼び出されることに注意してください。つまり、検索バーで追加および削除されたすべての文字を意味し、検索テキストが変更されるたびに searchFetchedResultsController を nil に設定しているためです。

この部分をコメントアウトするだけでうまくいきます

/*if (searchFetchedResultsController_ != nil)
{
NSLog(@"Returned !nil searchController");
return searchFetchedResultsController_;
}*/
于 2012-08-27T07:40:36.610 に答える