Содержание
Всем привет! Наверняка каждый из вас работал в приложениях, где можно было добавлять какие-то свои данные, а потом, пользуясь поиском, вы могли найти их. Так сделано в приложении «контакты» .
Сделать БД, используя Core Data не так и сложно, любой первый туториал вам доходчиво объяснит как это сделать, а вот с поиском сложнее… я потратил две последние ночи на поиск нужного туториала… Частично, представленный ниже код был в туториале, частично мой, и так, поехала
Первое: добавим «Search Bar and Search Display» в нашу таблицу
Сделать это можно программно или графически.
*.h файл
@interface TableViewController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate>{
UISearchBar *searchBar;
UISearchDisplayController *searchDisplayController;
}
*.m файл, метод viewDidLoad
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];searchDisplayController.delegate = self; searchDisplayController.searchResultsDataSource = self;
self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height); self.tableView.tableHeaderView = searchBar;
Графически, я думаю, поиск кинуть смогут все
Далее — заставим поиск искать
Вначале, выведем результаты поиска в отдельный массив:
*.h файл
@property (nonatomic, retain) NSMutableArray *searchResults;
@synthesize searchResults;
Создадим методы в viewDidLoad`e:
self.searchResults = [NSMutableArray arrayWithCapacity:["Ваш NSMutableArray с данным" count]]; [self.tableView reloadData];
изменим методы для отображения отфильтрованных ячеек таблицы
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return [self.searchResults count];
}
else
{
return ["Ваш NSMutableArray с данным" count];
}
}
Теперь поменяем конфигурацию ячейки
"Ваш entity" *book = ["Ваш NSMutableArray с данным" objectAtIndex:indexPath.row];if (tableView == self.searchDisplayController.searchResultsTableView) { book = [self.searchResults objectAtIndex:indexPath.row]; } else { NSLog(@"Configuring cell to show normal data"); }
Добавим фильтр
#pragma mark -
#pragma mark Content Filtering
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSLog(@"Previous Search Results were removed.");
[self.searchResults removeAllObjects];
for ("Ваш entity" *role in "Ваш NSMutableArray с данным")
{
if ([scope isEqualToString:@"All"] || [role."Ваш attribute (Core date)" isEqualToString:scope])
{
NSComparisonResult result = [role."Ваш attribute (Core date)" compare:searchText
options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)
range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
NSLog(@"Adding role.name '%@' to searchResults as it begins with search text '%@'", role.plasedive, searchText);
[self.searchResults addObject:role];
}
}
}
}
Еще пара методов:
#pragma mark UISearchDisplayController Delegate Methods- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString scope:@"All"]; return YES; }
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:@"All"]; return YES; }
Все! Пробуем запустить
