状態
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