Kyle Hayes
Kyle Hayes

Reputation: 5302

Why doesn't my search table view appear when beginning search?

I've wired a UISearchDisplayController into my app along with a search bar. I've initialized it as so:

self.filteredObjectArray = [NSMutableArray arrayWithCapacity:[self.objectArray count]];

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 43)];
searchBar.delegate = self;
[self.view addSubview:searchBar];

UISearchDisplayController *searchDisplay = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplay.delegate = self;
searchDisplay.searchResultsTableView.delegate = self;
searchDisplay.searchResultsDataSource = self;
searchDisplay.searchResultsDelegate = self;

Which is pretty much the way I've seen it in other examples. I've also implemented the appropriate delegate methods, with the important filterContentForSearchText and the shouldReload* methods shown below:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{   
    [self.filteredObjectArray removeAllObjects]; // First clear the filtered array.

    for (XRay *xray in objectArray) {
        NSString *combinedLabel = [self combinedLabel:xray];
        if ([combinedLabel rangeOfString:searchText options:(NSCaseInsensitiveSearch)].location != NSNotFound) {
            [self.filteredObjectArray addObject:xray];
        }
    }
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
     [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
    return YES;
}

However my search is not working when I give the search text box focus or input any characters. You'll also notice that the greyed out view does not appear over my regular table view.

Screenshot

EDIT cellForRowAtIndexPath

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

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

    XRay *xray = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        xray = [self.filteredObjectArray objectAtIndex:indexPath.row];

    } else {
        xray = [self.objectArray objectAtIndex:indexPath.row];
    }

    cell.textLabel.text = [self combinedLabel:xray];

    return cell;
}

Upvotes: 0

Views: 1185

Answers (2)

Kyle Hayes
Kyle Hayes

Reputation: 5302

I figured out what was wrong and I'm a bit surprised to be honest. Once I set a property on the SearchTableViewController: @property (nonatomic, strong) UISearchDisplayController *searchDisplay;

And updated my code to use that one, everything worked from there. Here is my initializing code with the new property.

- (void)viewDidLoad
{
    self.filteredObjectArray = [NSMutableArray arrayWithCapacity:[self.objectArray count]];

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 43)];
    searchBar.delegate = self;
    self.tableView.tableHeaderView = searchBar;

    self.searchDisplay = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

    self.searchDisplay.delegate = self;
    self.searchDisplay.searchResultsDataSource = self;
    self.searchDisplay.searchResultsDelegate = self;
}

Upvotes: 2

Narayana Rao Routhu
Narayana Rao Routhu

Reputation: 6323

Try with below code it will help you

 self.filteredObjectArray = [NSMutableArray arrayWithCapacity:[self.objectArray count]];
    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 43)];
    searchBar.delegate = self;
    //[self.view addSubview:searchBar];
    self.theTableView.tableHeaderView = searchBar;//theTableView your tableview object

    UISearchDisplayController *searchDisplay = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    self.searchController = searchDisplay;
    [searchBar release];
    searchDisplay.delegate = self;
    searchDisplay.searchResultsDataSource = self;
    searchDisplay.searchResultsDelegate = self;

Upvotes: 0

Related Questions