Add UISearchBar to UITableView programmatically not working

ios, objective-c, uisearchbar, uitableview

Solution

You should use a `UITableViewController` instead...

.h

@interface ExhibitorViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate> {
    sqlite3 *congressDB;
    NSMutableArray *searchData;
    UISearchBar *searchBar;
    UISearchDisplayController *searchDisplayController;
}

-(NSString *) filePath;
-(void)openDB;

@end

.m

-(void)loadTableView {

    searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 64)];
    searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    searchDisplayController.delegate = self;
    searchDisplayController.searchResultsDataSource = self;

    self.tableView.tableHeaderView = searchBar; 

}

The problem is you were creating a table view but not assigning it to the property, and using `UITableViewController` makes things much simpler anyway...

If you want to keep it the way it is now, then you could just put `self.tableView = tableVew;` after `[self.view addSubview:tableView];`...

Problem

Background: I have a `UIViewController` that, when loads, has a `UITableView` generated programmatically that gets its data from an `SQLite3` database. This works fine. Problem: I need to add a `UISearchBar` (and associated logic) but when I try, the UISearcBar is not rendered. Code so far: .h file: ``` #import <UIKit/UIKit.h> #import "sqlite3.h" #import "Exhibitor.h" @interface ExhibitorViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate> { sqlite3 *congressDB; NSMutableArray *searchData; UISearchBar *searchBar; UISearchDisplayController *searchDisplayController; } @property (strong, nonatomic) IBOutlet UITableView *tableView; -(NSString *) filePath; -(void)openDB; @end ``` .m file where the UISearchBar is added: ``` -(void)loadTableView { CGRect usableSpace = [[UIScreen mainScreen] applicationFrame]; CGFloat usableWidth = usableSpace.size.width; CGFloat usableHeight = usableSpace.size.height; UITableView *tableView = [[UITableView alloc] init]; [tableView setFrame:CGRectMake(0,0,usableWidth, usableHeight)]; tableView.dataSource = self; tableView.delegate = self; [self.view addSubview:tableView]; searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 64)]; searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; searchDisplayController.delegate = self; searchDisplayController.searchResultsDataSource = self; self.tableView.tableHeaderView = searchBar; // I think this should have loaded the searchBar but doesn't // [self.tableView setTableHeaderView:searchBar]; // Have also tried this // [self.tableView.tableHeaderView addSubview:searchBar]; // And this NSLog(@"searchBar = %@", searchBar); // This shows the searchBar is an object with values NSLog(@"HeaderView = %@", self.tableView.tableHeaderView); // This shows the tableHeaderView as null ?? } ``` What am I doing wrong? What do I need to do to add a `UISearchBar` programmatically to a `UITableView` within a `UIVewController`?

Original source