UISearchDisplayController выполняет большую часть тяжелой работы за вас.
Поместите UISearchBar (не UITextField) в вашем представлении и подключите к нему UISearchDisplayController..
// ProductViewController.h
@property IBOutlet UISearchBar *searchBar;
@property ProductSearchController *searchController;
// ProductViewController.m
- (void) viewDidLoad
{
[super viewDidLoad];
searchBar.placeholder = @"Search products";
searchBar.showsCancelButton = YES;
self.searchController = [[[ProductSearchController alloc]
initWithSearchBar:searchBar
contentsController:self] autorelease];
}
Я обычно подкласс UISearchDisplayController, и это его собственный делегат, searchResultsDataSource и searchResultsDelegate.Последние два управляют таблицей результатов обычным образом.
// ProductSearchController.h
@interface ProductSearchController : UISearchDisplayController
<UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource>
// ProductSearchController.m
- (id)initWithSearchBar:(UISearchBar *)searchBar
contentsController:(UIViewController *)viewController
{
self = [super initWithSearchBar:searchBar contentsController:viewController];
self.contents = [[NSMutableArray new] autorelease];
self.delegate = self;
self.searchResultsDataSource = self;
self.searchResultsDelegate = self;
return self;
}
Каждое нажатие клавиши на панели поиска вызывает searchDisplayController:shouldReloadTableForSearchString:
.Быстрый поиск может быть реализован прямо здесь.
- (BOOL) searchDisplayController:(UISearchDisplayController*)controller
shouldReloadTableForSearchString:(NSString*)searchString
{
// perform search and update self.contents (on main thread)
return YES;
}
Если ваш поиск может занять некоторое время, сделайте это в фоновом режиме с помощью NSOperationQueue .В моем примере ProductSearchOperation будет вызывать showSearchResult:
, когда и если он завершится.
// ProductSearchController.h
@property INSOperationQueue *searchQueue;
// ProductSearchController.m
- (BOOL) searchDisplayController:(UISearchDisplayController*)controller
shouldReloadTableForSearchString:(NSString*)searchString
{
if (!searchQueue) {
self.searchQueue = [[NSOperationQueue new] autorelease];
searchQueue.maxConcurrentOperationCount = 1;
}
[searchQueue cancelAllOperations];
NSInvocationOperation *op = [[[ProductSearchOperation alloc]
initWithController:self
searchTerm:searchString] autorelease];
[searchQueue addOperation:op];
return NO;
}
- (void) showSearchResult:(NSMutableArray*)result
{
self.contents = result;
[self.searchResultsTableView
performSelectorOnMainThread:@selector(reloadData)
withObject:nil waitUntilDone:NO];
}