UITableView HeaderView 上的 SearchDisplayController 怪异行为
SearchDisplayController weird behaviour on UITableView HeaderView
我一直想知道如何针对这种情况实施最佳实践。
我有一个 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 在编辑时出现奇怪的位置和行为,如下图所示。
第一响应者使状态栏重叠,尽管我已经添加了我的 viewDidLoad
self.edgesForExtendedLayout = UIRectEdgeNone;
并且在编辑它时导致此问题:双倍搜索栏
如果我删除 searchDisplayController.searchResultsDelegate = self;所有的视图看起来都很完美,但我需要这个委托来触发 searchResultTableView 上的 didSelectedRow。这怎么可能?这种情况的最佳方法是什么。谢谢!
更新
因为我到处搜索,并借助给出的答案,我可以得出结论,如果你想在 UITableView 上修复 SearchBar,只需在 UIViewController 上创建 tableview,放置 searchBar,放置一些约束,然后然后瞧!
不要在 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
}
Objective-C
这里有一个很好的 link 说明如何在 objective-c 中完成此操作:
How to implement UISearchController with objective c
我一直想知道如何针对这种情况实施最佳实践。
我有一个 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 在编辑时出现奇怪的位置和行为,如下图所示。
第一响应者使状态栏重叠,尽管我已经添加了我的 viewDidLoad
self.edgesForExtendedLayout = UIRectEdgeNone;
并且在编辑它时导致此问题:双倍搜索栏
如果我删除 searchDisplayController.searchResultsDelegate = self;所有的视图看起来都很完美,但我需要这个委托来触发 searchResultTableView 上的 didSelectedRow。这怎么可能?这种情况的最佳方法是什么。谢谢!
更新
因为我到处搜索,并借助给出的答案,我可以得出结论,如果你想在 UITableView 上修复 SearchBar,只需在 UIViewController 上创建 tableview,放置 searchBar,放置一些约束,然后然后瞧!
不要在 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
}
Objective-C
这里有一个很好的 link 说明如何在 objective-c 中完成此操作: How to implement UISearchController with objective c