状態
UISearchDisplayController を使った場合の状態イメージはこう。
表示用のビューは UITableView と UISearchResultsTableView の2つが、状態によって切り替わるようにできている。
通常は1つの UITableViewController に対して、これら2つのビューを結びつける(DataSource/Delegate)ことになる。
この為、Data Source / Delegate のメソッド内では必要に応じて、どちらのビューを扱っているのかを判断する。
[例] - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == self.searchDisplayController.searchResultsTableView) { return [self.filteredListContent count]; } else { return [self.listContent count]; } }
またモデルである NSFetchedResultsController を1つだけ用意して両方の状態で利用する場合は、検索時には条件の設定を、検索後には条件クリア(全件)を行う必要がある。
[例] #pragma mark - #pragma mark UISearchDisplayController Delegate - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { NSString *query = self.searchDisplayController.searchBar.text; if (query && query.length) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Title contains[cd] %@", query]; [self.fetchedResultsController.fetchRequest setPredicate:predicate]; } [self reloadFetchedResultsController]; } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString scope: [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; return YES; } #pragma mark - #pragma mark UISearchBar Delegate - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [self.fetchedResultsController.fetchRequest setPredicate:nil]; [self reloadFetchedResultsController]; }
なお iPhone付属の iPod では、検索時には別途 UITableView が用意される性質を利用して、検索結果の表示をカスタマイズしている。iPhodの場合、アーティストやアルバムでグルーピングし、Section毎に結果を表示している。
参考情報
Cocoaの日々: UISearchDisplayController 調査Cocoaの日々: UISearchDisplayController と NSFetchedResultContoller を組み合わせる
Cocoaの日々: UISearchDisplayController と NSFetchedResultContoller を組み合わせる (2) バグ修正
Responses
Leave a Response