これがサンプルコードです
NSMutableArray *filteredResult; // this holds filtered data source
NSMutableArray *tableData; //this holds actual data source
-(void) filterForSearchText:(NSString *) text scope:(NSString *) scope
{
[filteredResult removeAllObjects]; // clearing filter array
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF.restaurantName contains[c] %@",text]; // Creating filter condition
filteredResult = [NSMutableArray arrayWithArray:[tableData filteredArrayUsingPredicate:filterPredicate]]; // filtering result
}
デリゲート メソッド
-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterForSearchText:searchString scope:[[[[self searchDisplayController] searchBar] scopeButtonTitles] objectAtIndex:[[[self searchDisplayController] searchBar] selectedScopeButtonIndex] ]];
return YES;
}
-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterForSearchText:self.searchDisplayController.searchBar.text scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
}
NSPredicate 条件 "@"SELF.restaurantName contains[c] %@",text " restaurantName は、フィルタリングする必要があるプロパティ名です。データソース配列に NSString しかない場合は、 @"SELF contains[c] %@",text のように使用できます
フィルターが完了したら、それに応じてテーブルビュー デリゲートを実装する必要があります。このようなもの
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(tableView == [[self searchDisplayController] searchResultsTableView])
{
return [filteredResult count];
}
else
{
return [tableData count];
}
}
フィルタリングされたテーブルビューであるか元のテーブルビューであるかをテーブルビューで比較し、それに応じてテーブルビューのデリゲートとデータソースを設定します。
上記のコードを機能させるには、XIB またはストーリーボードで使用している場合は、「検索バーと検索表示」オブジェクトを使用する必要があります。