Для начала надо подготовить основной контроллер вьюхи для работы с UISearchBar:
Результаты поиска будут храниться во вспомогательном массиве searchResults . Поэтому нужно немного подкорректировать следующие методы:
и
@interface MyViewController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource> {
// For Search!
NSArray *searchResults;
IBOutlet UISearchDisplayController *searchController;
}
@property(nonatomic, copy) NSArray *searchResults;
@property(nonatomic, retain) IBOutlet UISearchDisplayController *searchController;
@end
Затем добавить во вьюху Search Display Controller и правильно соединить его с аутлетами! В качестве делегата естественно назначить FileOwner.
И добавить следующие методы:
#pragma mark - UISearchDisplayController delegate methods
- (void)filterContentForSearchText:(NSString*)searchText
scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:
@"name contains %@", searchText];
self.searchResults = [myObject.subObjArray filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text]
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:searchOption]];
return YES;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
NSInteger rows = 0;
if ([tableView
isEqual:self.searchDisplayController.searchResultsTableView]){
rows = [self.searchResults count];
}
else{
rows = [myObj.subObjArray count];
}
return rows;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Чтобы фильтр, а точнее предикат не был чувствителен к регистру, можно сделать так: CONTAINS[c], либо [NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...];
ОтветитьУдалитьлибо ANY name CONTAINS[cd]
пробуйте!