Всем привет! Наверняка каждый из вас работал в приложениях, где можно было добавлять какие-то свои данные, а потом, пользуясь поиском, вы могли найти их. Так сделано в приложении «контакты» .

Сделать БД, используя 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; }

Все! Пробуем запустить :)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *