UISearchDisplayController と NSFetchedResultContoller を組み合わせる (3) 考察

2010年7月21日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

UISearchDisplayController と NSFetchedResultContoller を使う場合のメモなど。


状態


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

人気の投稿(過去 30日間)