以编程方式创建自定义UISearchDisplayController

时间:2014-02-01 20:13:03

标签: iphone objective-c ios7

我能够使用Storyboard创建一个应用程序 - 它有一个导航控制器,其中包含一个带有搜索显示控制器的表视图控制器,并按预期工作。

然后我决定通过向导航栏添加UIButtonBarSystemItemSearch(放大镜)来自定义它,以便在触摸时它会在导航栏上显示搜索栏,就像setDisplaysSearchBarInNavigationBar一样。为此,我从故事板中删除了UISearchDisplayController并以编程方式添加它,如下面的代码所示。触摸放大镜时会调用btnSearchClicked功能,因此按钮会正确连接。

我的项目与Apple示例项目“AdvancedTableSearch”非常相似,但没有范围栏。

- (IBAction) btnSearchClicked:(id)sender
{
  //Set up search bar
  UISearchBar *mySearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
  [mySearchBar setDelegate:self];
  [mySearchBar setShowsCancelButton:YES animated:NO];

  // Set up search display controller
  UISearchDisplayController *mySearchController = [[UISearchDisplayController alloc] initWithSearchBar:mySearchBar contentsController:self];
  mySearchController.delegate = self;
  mySearchController.searchResultsDataSource = self;
  mySearchController.searchResultsDelegate = self;
  //mySearchController.displaysSearchBarInNavigationBar = YES;
  mySearchController.navigationItem.titleView.opaque = NO;
  [self.navigationController.navigationBar addSubview:self.searchDisplayController.searchBar];
}

我对这种方法有两个问题。 最重要的是,即使我设置了委托属性,当我在搜索栏中输入时,也不会调用任何委托函数(具体为shouldReloadTableForSearchString

第二个问题是,尽管调用setShowsCancelButton方法,仍无法显示取消按钮。

去年我一直在学习iOS并阅读我在SO上可以找到的所有东西,但是无法想出这一点。这是我的最后一招,如果必须的话,我会回到标准搜索栏的旧故事板方法。我喜欢这种方法的原因是我有一个很长的联系人列表(~5000),并且不想滚动到顶部来获取搜索栏。

1 个答案:

答案 0 :(得分:1)

您似乎没有添加正确的searchDisplayController?你添加了self.searchDisplayController但是在mySearchController中。尝试将最后一行放在:   [self.navigationController.navigationBar addSubview:mySearchController.searchBar];