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;
}
Каждое нажатие в SearchBar вызывает 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];
}
В интерфейсе строителя, UISearchBar кажется стиле появляться (как называется) в панели инструментов, в то время, как UITextField стилизовано, чтобы хорошо выглядеть на пустой странице. Есть ли способ сделать UISearchBar, который не должен находиться в «баре» - например, если вы хотите иметь несколько текстовых полей с поддержкой поиска на странице? – radven
@radven Вы должны спросить об этом на верхнем уровне вопроса на сайте. –
Выполнено - отправлено здесь: http://stackoverflow.com/questions/10792578/making-a-uisearchbar-a-drop-in-replacement-for-a-uitextfield – radven