Чтобы добавить UISearchBar в UITableView, необходимо выполнить следующие действия:
- Объявить и инициализировать UISearchBar
- Объявить и инициализировать UISearchDisplayController
- Добавить панель поискав tableView
- Реализация делегата UISearchDisplayController
- В заголовочном файле я объявляю свой searchBar, searchDisplayController и массивы, которые содержат данные для отображения.
ViewController.h:
#import
@interface ViewController : UITableViewController
{
NSArray *originalData;
NSMutableArray *searchData;
UISearchBar *searchBar;
UISearchDisplayController *searchDisplayController;
}
@end
Я также добавил в класс 2 делегата: UISearchBarDelegate и UISearchDisplayDelegate, без, searchBar просто не работает!
Инициализация данных:
//ViewController.m
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
NSArray *group1 = [[NSArray alloc] initWithObjects:@"Napoli", @"Juventus", @"Inter", @"Milan", @"Lazio", nil];
NSArray *group2 = [[NSArray alloc] initWithObjects:@"Real Madrid", @"Barcelona", @"Villareal", @"Valencia", @"Deportivo", nil];
NSArray *group3 = [[NSArray alloc] initWithObjects:@"Manchester City", @"Manchester United", @"Chelsea", @"Arsenal", @"Liverpool", nil];
originalData = [[NSArray alloc] initWithObjects:group1, group2, group3, nil];
searchData = [[NSMutableArray alloc] init];
}
return self;
}
Теперь нам нужно инициализировать два наших объекта, я прокомментировал код, чтобы объяснить, что я делаю:
//ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
/*the search bar widht must be > 1, the height must be at least 44
(the real size of the search bar)*/
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
/*contents controller is the UITableViewController, this let you to reuse
the same TableViewController Delegate method used for the main table.*/
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
//set the delegate = self. Previously declared in ViewController.h
self.tableView.tableHeaderView = searchBar; //this line add the searchBar
//on the top of tableView.
}
Я решил пропустить часть об инициализации ячейки tableView, вы можете найти ее в загружаемом источникекод.:)
Когда tableView будет готов, пришло время реализовать UISearchDisplayControllerDelegate!
Делегат имеет много методов для управления каждым аспектом поиска, но наиболее важным является
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
Этот метод вызывается каждый раз, когда вы вставляете новый символ в строку поиска, вы берете searchString, выполняете поиск по элементам таблицы и возвращаете YES.
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[searchData removeAllObjects];
/*before starting the search is necessary to remove all elements from the
array that will contain found items */
NSArray *group;
/* in this loop I search through every element (group) (see the code on top) in
the "originalData" array, if the string match, the element will be added in a
new array called newGroup. Then, if newGroup has 1 or more elements, it will be
added in the "searchData" array. shortly, I recreated the structure of the
original array "originalData". */
for(group in originalData) //take the n group (eg. group1, group2, group3)
//in the original data
{
NSMutableArray *newGroup = [[NSMutableArray alloc] init];
NSString *element;
for(element in group) //take the n element in the group
{ //(eg. @"Napoli, @"Milan" etc.)
NSRange range = [element rangeOfString:searchString
options:NSCaseInsensitiveSearch];
if (range.length > 0) { //if the substring match
[newGroup addObject:element]; //add the element to group
}
}
if ([newGroup count] > 0) {
[searchData addObject:newGroup];
}
[newGroup release];
}
return YES;
}
Вот и все!Этот метод будет выполнять полнотекстовый поиск по всему элементу.Когда поиск завершится, tableView перезагрузится.См. Исходный код для просмотра других подробностей.
Загрузить исходный файл (ссылка ОБНОВЛЕНА! (04.01.2016))