以编程方式将UISearchBar添加到UITableView不起作用

时间:2014-02-18 09:46:38

标签: ios objective-c uitableview uisearchbar

后台:我有UIViewController,在加载时,以编程方式生成UITableView,从SQLite3数据库获取其数据。这很好用。

问题:我需要添加UISearchBar(及相关逻辑),但是当我尝试时,UISearcBar不会被渲染。

到目前为止

代码:

.h文件:

#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文件,其中添加了UISearchBar:

-(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 ?? 

}

我做错了什么?如何以编程方式将UISearchBar添加到UITableView中的UIVewController

2 个答案:

答案 0 :(得分:13)

您应该使用UITableViewController而不是......

<强>·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; 

}

问题是你正在创建一个表视图但没有将它分配给属性,并且使用UITableViewController使事情变得更简单......

如果您想保持现在的状态,那么您可以在self.tableView = tableVew;之后放置[self.view addSubview:tableView]; ...

答案 1 :(得分:3)

问题在于

self.tableView
loadTableView中的

是nil,或者它不是您以编程方式创建的表。

添加

self.tableView = tableView;

[self.view addSubview:tableView];

如果不将此搜索栏添加到无效的tableView。