Я часами читал пару десятков разных блогов и других вопросов здесь на ТАК об этом, но я в тупике.
Мой вопрос: как заставить эту вещь работать? Я пробовал это в IB и через код.
Когда я пробовал это в IB, панель поиска никогда не показывалась, даже если я перетащил ее в табличное представление (UITableViewController), и она «привязалась» к таблице, которой принадлежит заголовок. Но панель поиска никогда не появится. (Это подвопрос, кто-нибудь знает почему?)
Итак, я попытался настроить только в коде. Я распределяю его, назначаю делегата и источник данных, но я никогда не получаю табличное представление с надписью «Нет результатов». Появилась полоса, и я могу ввести ее, но она всегда показывает пустую таблицу, хотя я знаю, что результаты должны быть. Я подозреваю, что не отображается правильная таблица, поскольку ячейка с текстом «Нет результатов» не отображается.
- (void)viewDidLoad {
[super viewDidLoad];
names = [[NSMutableArray alloc] initWithObjects:@"Michael", @"Dwight", @"Jim", @"Andy", @"Ryan", @"Creed", @"Darryl", @"Kevin", @"Oscar", @"Gabe", nil];
results = [[NSMutableArray alloc] init];
UISearchBar *sb = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
sb.tintColor = [UIColor greenColor];
searchTable.tableHeaderView = sb;
UISearchDisplayController *sdc = [[UISearchDisplayController alloc] initWithSearchBar:sb contentsController:self];
[self setSearchDisplayController:sdc];
[sdc setDelegate:self];
[sdc setSearchResultsDataSource:self];}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.searchTable) {
// normal table view population
return [names count];
}
if(tableView == self.searchDisplayController.searchResultsTableView){
// search view population
return [results count];
}
return 0;
}
// Customize the appearance of table view cells.
- (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];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
}
if (tableView == self.searchTable) {
// normal table view population
cell.textLabel.text = [names objectAtIndex:indexPath.row];
}
if(tableView == self.searchDisplayController.searchResultsTableView){
// search view population
}
cell.textLabel.textColor = [UIColor blueColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView == self.searchTable) {
// normal table view population
}
if(tableView == self.searchDisplayController.searchResultsTableView){
// search view population
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
// Return YES to cause the search result table view to be reloaded.
return YES;
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
[results removeAllObjects]; // First clear the filtered array.
/*
Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array.
*/
for (NSString *str in names)
{
NSComparisonResult result = [str compare:controller.searchBar.text options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [controller.searchBar.text length])];
if (result == NSOrderedSame)
{
[results addObject:str];
}
}
}
Any help would be so very much appreciated. I would add a bounty, but as you can see, I've got "Newb" written on my forehead still :).