SearchIisplayController在UITableView HeaderView上的奇怪行为

时间:2016-05-21 08:38:39

标签: ios objective-c uitableview uisearchbar uisearchdisplaycontroller

我一直想知道如何在这种情况下实施最佳做法。

我有一个UITableViewController,并希望以编程方式添加searchBar,所以我在viewForHeaderInSection上做了这个

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)];
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)];
searchBar.placeholder = @"Search";
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchBar.delegate=self;
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self; //This one keep messing with the layout
[view setBackgroundColor:[UIColor blackColor]];
[view addSubview:searchBar];
return view;
}

注释行在编辑时导致我的searchBar奇怪的位置和行为,如下图所示。

Normal position

When firstResponder

第一响应者使状态栏重叠,但我添加了viewDidLoad

self.edgesForExtendedLayout = UIRectEdgeNone;

编辑时导致此问题:Doubled Search Bar When Editing

如果我删除searchDisplayController.searchResultsDelegate = self;所有视图看起来都很完美,但是我需要这个委托在searchResultTableView上触发didSelectedRow ..这怎么可能?这种情况的最佳方法是什么?谢谢!

更新

由于我在这里和那里搜索,并且在给出的答案的帮助下,我可以得出结论,如果你想在UITableView上修复SearchBar,只需在UIViewController上创建tableview,放入searchBar,放一些约束然后瞧!

1 个答案:

答案 0 :(得分:1)

不要在viewForHeaderInSection中创建searchController,而是为viewController创建一个searchController变量,如下所示:

let searchController = UISearchController(searchResultsController: nil)

然后使用此函数对其进行配置,并在viewDidLoad中调用此函数:

func configureSearchController() {
    searchController.searchBar.delegate = self
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.barTintColor = UIColor.whiteColor()
    searchController.searchBar.tintColor = UIColor.blackColor()
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar
}

<强>目标C

以下是如何在objective-c中完成此操作的绝佳链接: How to implement UISearchController with objective c