表格视图中的SearchBar与searchDisplayController以编程方式无编辑

时间:2011-01-07 19:34:50

标签: iphone uisearchbar edit uisearchdisplaycontroller

我正在尝试使用表格标题视图中的搜索栏创建一个tableview。我想使用searchDisplayController来管理所有内容。 我已经以编程方式创建了所有内容(我对IB感觉不舒服)试图设置所有正确的属性,但似乎我遗漏了一些东西,因为当表格出现时我无法编辑文本搜索栏并查看任何动画。 以下是代码的一部分:

- (void)viewDidLoad {
    [super viewDidLoad];
    UISearchBar *searchBarTMP=[[UISearchBar alloc]init];
    self.searchBar=searchBarTMP;
    [searchBarTMP release];
    self.searchBar.autocapitalizationType=UITextAutocapitalizationTypeNone;
    self.searchBar.delegate=self;
    self.searchBar.showsScopeBar=YES;
    self.searchBar.keyboardType=UIKeyboardTypeDefault;
    self.searchBar.userInteractionEnabled=YES;
    self.searchBar.multipleTouchEnabled=YES;

    self.searchBar.scopeButtonTitles=[NSArray arrayWithObjects:NSLocalizedString(@"City",@"Scope City"),NSLocalizedString(@"Postal Code",@"Scope PostalCode"),nil];
    self.tableView.tableHeaderView=searchBar;
    self.searchBar.selectedScopeButtonIndex=0;
    self.navigationItem.title=NSLocalizedString(@"Store",@"Table title");

    //SearchDisplayController creation
    UISearchDisplayController *searchDisplayControllerTMP = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    self.searchDisplayController=searchDisplayControllerTMP;
    [searchDisplayControllerTMP release];
    self.searchDisplayController.delegate=self;
    self.searchDisplayController.searchResultsDelegate=self;
    self.searchDisplayController.searchResultsDataSource=self;  

    //....continue
}

我知道当你单独使用搜索栏时,你必须处理它的委托协议,但我猜测searchDisplayController为你管理,如Apple示例代码所示。 (与IB一起建立。)

有什么建议吗? 谢谢, 安德烈

2 个答案:

答案 0 :(得分:1)

发现它...... 放入表视图的标题后必须写

[self.searchBar sizeToFit];

答案 1 :(得分:0)

如果您使用ARC,请确保在头文件中为UISearchDisplayController创建iVar。

如果使用以下方法创建UISearchDisplayController:

UISearchDisplayController* searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchField contentsController:self];

它将由ARC发布,它不会调用任何委托方法,当你调用self.searchDisplayController(UIViewController的属性)时,它将是nil

所以,修复是: 在标题(.h)文件中:

@interface MenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate> {
        UISearchDisplayController* searchDisplayController;
        UISearchBar *searchField;
        UITableView* tableView;
        NSArray* searchResults;
}

并在实现(.m)文件中:

searchField = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 49)];
searchField.delegate = self;

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchField contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;

tableView.tableHeaderView = searchField;
tableView.contentOffset = CGPointMake(0, searchField.frame.size.height);

如果按此方式实施,您可以在其余代码中同时调用self.searchDisplayControllersearchDisplayController