UISearchDisplayController - как реализовать и заставить его работать - PullRequest
1 голос
/ 22 апреля 2011

Я часами читал пару десятков разных блогов и других вопросов здесь на ТАК об этом, но я в тупике.

Мой вопрос: как заставить эту вещь работать? Я пробовал это в 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 :).

1 Ответ

0 голосов
/ 22 апреля 2011

Пару возможных точек сбоя, которые я вижу:

1) Вы устанавливаете свой viewcontroller как делегат в его .h файле?пример:

@interface myViewController : UIViewController <UISearchBarDelegate,UISearchDisplayDelegate,UITableViewDataSource,UITableViewDelegate>{

2) Я не могу сказать, является ли это ваш полный код или просто соответствующие фрагменты, но если это полный код, то есть пара дыр, прежде чем вы увидите какие-либо данные.Вам нужно добавить табличное представление где-то там, чтобы отобразить результаты, и заполнить второй оператор if в вашем методе cellForRowAtIndexPath.

Я бы рекомендовал проверить пример кода для TableSearch от Apple, это должно заставить вас двигаться в правильном направлении.

...