Содержание
Всем привет! Наверняка каждый из вас работал в приложениях, где можно было добавлять какие-то свои данные, а потом, пользуясь поиском, вы могли найти их. Так сделано в приложении «контакты» .
Сделать БД, используя 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; }
Все! Пробуем запустить
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: