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
しかし、違いはありませんでした...何かを入力するまでは空白にしてください。
プリロードされた検索結果を取得する方法を知っている人はいますか?