Как я реализовывал.
Есть класс наследник от UIViewController в котором находятся визуальные компоненты (UISearchBar и UITableView). Так-же этот класс содержит два массива: массив со всеми элементами которые могут присутствовать в списке, второй с элементами которые удовлетворяют условиям поиска. Изначально массивы равны. Второй массив необходимо отображать в UITableView и применять к нему фильтр при изменении текста в UISearchBar. Просто?
Начнем с функции поиска, в моем случае я у меня строковые массивы (itemsList - со всеми элементами, searched - с элементами которые удовлетворяют условию из UISearchBar). Единственным параметр функции - строка из UISearchBar:
- - (void) search:(NSString *) matchString
- {
- NSString *upString = [matchString uppercaseString];
- if (searched)
- [searched release];
- searched = [[NSMutableArray alloc] init];
- for (NSString *line in itemsList)
- {
- if ([matchString length] == 0)
- {
- [searched addObject:line];
- continue;
- }
- NSRange range = [[line uppercaseString] rangeOfString:upString];
- if (range.location != NSNotFound)
- [searched addObject:line];
- }
- [tv reloadData]; // UITableView
- }
я тут не боролся за оптимальность поиска. Можно было б не пересоздавать при каждом вызове массив searched, а так-же учитывать предыдущий поиск.
Функция search: должна вызываться при каждом изменении в UISearchBar, для которого нужно определить делегат с методом searchBar:textDidChange:
- - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
- {
- [self search:searchText];
- }
так-же для иницилизации массива searched метод search: нужно вызвать при загрузке вью конттроллера, например в методе loadView
- - (void)loadView
- {
- [self search:@""];
- }
и осталось отобразить массив searched в UITableView
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell *rv = nil;
- NSString *cellID = @"cell_ID";
- rv = [tableView dequeueReusableCellWithIdentifier:cellID];
- if (rv==nil)
- {
- rv = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease];
- }
- rv.textLabel.text = [searched objectAtIndex:indexPath.row];
- return rv;
- }
В статье не описано, что нужно обрабатывать появление клавиатуры, а так-же можно скрывать UINavigationBar при фокусе на UISearchBar, что есть в примере.
Спасибо, полезная статья!
ОтветитьУдалить