5

InterfaceBuilderのUITableViewControllerにUISearchDisplayControllerを追加しました。searchBar: searchBar textDidChange: searchTextテーブルのデータ配列を再生成してを呼び出すメソッドを追加することで、非常に簡単に機能させることができましたreloadData

ただし、(X)をタッチしてクリアする方が、もう一度入力するよりもはるかに簡単なので、ユーザーが次に検索バーをタッチしたときに、前回の検索を表示したいと思います。しかし、私はそれをすることができません。以下は私が試したコードです:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText {
    if( searchText && [searchText length] > 0 ) {
        self.displayedRows = [[NSMutableArray initWithCapacity: 1];
        for( NSString *l in self.allRows ) {
            NSRange r = [l rangeOfString: searchText];
            if( r.location != NSNotFound )
                [self.displayedRows addObject: l];
        }
        [self.searchDisplayController.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller {
    if( self.lastSearch && [self.lastSearch length] > 0 ) {
        controller.searchBar.text = self.lastSearch;
        [controller.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller {
    self.lastSearch = controller.searchBar.text;
    self.displayedRows = self.allRows;
    [self.tableView reloadData];
}

最後の検索テキストは、次に検索をタッチしたときに検索バーに適切に表示され、「カーソル」が最後に配置されていても検索結果が表示されず、元のコンテンツの暗いビューだけが表示されていることに驚きました。検索フィールドが空でした。文字を入力するとすぐに検索結果が更新されます。

私は[self.searchDisplayController.searchResultsTableView reloadData]それぞれに同等のものを入れてみました:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView

しかし、違いはありませんでした...何かを入力するまでは空白にしてください。

プリロードされた検索結果を取得する方法を知っている人はいますか?

4

1 に答える 1

7

次のようなものが必要です。

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    if(lastSearch.length > 0) {
        NSLog(@"In searchDisplayControllerDidBeginSearch");
        [self.searchDisplayController.searchBar setText:lastSearch];
    }
}

さらに変更を加える必要がある場合は、UIKitヘッダーUISearchBar.hを開いて、UISearchDisplayController.h何をどこでオーバーロードできるかを確認することをお勧めします。また、NSLogあなたの友達は=)

また

何が起こっているのか、そしてこれがとどのように違うのかを説明するために...searchBar.text = lastSearchsetText強制textDidChange的に登録します。これにより、検索がやり直され、その後、が呼び出されshouldReloadTableForSearchStringます。setText(何らかの理由で)使用せずにテキストを変更するだけでは、はトリガーされませんtextDidChange

于 2011-02-03T02:00:03.250 に答える