1. Qiita
  2. 投稿
  3. iOS8

iOS8以降はUISearchControllerを使え

  • 43
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

TableViewに検索フォームを付ける場合は、UISearchDisplayControllerを実装していましたがiOS8からはUISearchControllerを使えとなってます。

古いプロジェクトを放置しっぱなしだと、この手の新しいAPIで作り変えるのは非常に萎える作業ですが、頑張ってついて行きたいと思います。

UISearchControllerですが、StoryBoardではなく、コードで実装します。
ViewControllerの中で、

ViewController.m
@property (strong, nonatomic) UISearchController *contactSearchController;

とします。次にUISearchControllerをtableViewに追加します。tableViewはStoryboardで設置しておきます。

ViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchController *contactSearchController = [[ UISearchController alloc ] initWithSearchResultsController:nil ];
    contactSearchController.searchResultsUpdater = self;
    contactSearchController.hidesNavigationBarDuringPresentation = false;
    contactSearchController.dimsBackgroundDuringPresentation = false;
    contactSearchController.searchBar.searchBarStyle = UISearchBarStyleProminent;
    [contactSearchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = contactSearchController.searchBar;

    self.contactSearchController = contactSearchController;
}

これだけで、表示はできますが、フォームをクリックすると落ちるので、下記を追加

ViewController.m
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {

    // tableViewに表示する内容を抽出します。
  // 入力されたテキストは、searchController.searchBar.text として取り出せます。
    // フィルタ作業ができたら、tableViewをreloadして終わりです

    [self.tableView reloadData];

}

各tableViewの中での処理は単にself.contactSearchController.activeがtrueかfalseをみれば、検索結果を表示しているのかそうではないかが判断つきます。

ViewController.m
if ( self.contactSearchController.active ) {
    // 検索結果表示
}

この辺のdelegate処理の話です。

ViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

UISearchDisplayControllerでも似たような感じで処理しますが、呼ばれるのがひとつだけなのでちょっと楽になった感じですね。
そうそう、検索結果を選択して何かしようとする場合は、
self.contactSearchController.active = false;
とするのをお忘れなく。