ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

UISearchDisplayController

UISearchDisplayController — один из самых полезных и в то же время, самых слабодокументируемых элементов интерфейса. С названия можно понять, что этот элемент предназначен для осуществления поиска. В это примере я продемонстрирую как это делать. Для начала создадим новый проект на основе шаблона (Navigation-Based Application) и назовем его SearchDisplayController. Затем изменим класс RootViewController:

 

RootViewController.h

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface RootViewController : UITableViewController &lt;UISearchDisplayDelegate&gt; {
    NSArray *content;
    NSArray *filteredContent;
}

@property (nonatomic, retain) NSArray *content;
@property (nonatomic, retain) NSArray *filteredContent;

@end</code>

 

Здесь мы подключили протокол UISearchDisplayDelegate и объявили два массива. В content мы будем хранить все данные, а в filteredContent результат поиска.

 

RootViewController.m

<code data-result="[object Object]">#import "RootViewController.h"

@implementation RootViewController

@synthesize content;
@synthesize filteredContent;

- (void)dealloc
{
    self.content = nil;
    self.filteredContent = nil;
    [super dealloc];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationItem.title = @"Names";

    self.content = [NSArray arrayWithObjects:@"Tom",@"Robin",@"Mark",@"Emily",@"Amy",@"Alex",@"Daniel", nil];
    self.filteredContent = [NSArray array];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return filteredContent.count;
    } else {
        return content.count;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CellIdentifier] autorelease];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [filteredContent objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [content objectAtIndex:indexPath.row];
    }
    return cell;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString 
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[cd]%@",searchString];
    self.filteredContent = [content filteredArrayUsingPredicate:predicate];
    return YES;
}

@end</code>

 

После синтезирования методов доступа для наших массиовов, в методе viewDidLoad мы их инициализируем, при этом массив contentмы заполняем именами людей, а filteredContent оставляем пустым (мы его будем запускать во время поиска). Кроме инициализации массивов мы устанавливаем надпись TopBar (подробнее о TopBar можно прочитать здесь). В методе numberOfRowsInSection мы проверяем на валидность поисковый запрос. То есть, пользователь ввел какую-то строку для поиска — мы отображаем возвращаем количество записей массива, в котором хранятся результаты поиска, в противном случае — количество записей массива content. В методе cellForRowAtIndexPath происходит то же самое. Если поисковый запрос валидный — выводим данные с filteredContent, иначе — с content.

 

Метод shouldReloadTableForSearchString как раз и является тем тодом, ради которого мы подключали протокло UISearchDisplayDelegate. В нем мы выполняем отбор (принимаем фильтрацию для массива), подробнее о том как делать отбор и сортировку элементов массива можно прочитать в соответствующем уроке NSArray (массивы).

 

Теперь осталось добавить UISearchDisplayController вместе с UISearchBar в интерфейс, как это сделано на картинке ниже.

 

 

А сортировка объектов должна выглядеть так:

 

 

Обращаю внимание на то, что никаких связей устанавливать не нужно. Xcode сделает это автоматически.

 

Конечно же, это не все свойства и методы UISearchDisplayController, но данный пример является хорошим стартом для знакомства с этим элементом интерфейса. Исходный код этого проекта можно скачать здесь.