在我的应用程序中,我有一个导航控制器(N1),用搜索栏控制一个tableview控制器(T1)。 当搜索栏变为活动状态时,将从故事板中显示新的导航控制器(N2)以显示搜索结果。 (见图)
这完全正常,直到iOS 11,搜索栏从tableview标题移动到导航栏。
部分解决方案是区分操作系统版本,如下所示:
-(void)initSearchController{
UINavigationController *searchResultsController = [[self storyboard] instantiateViewControllerWithIdentifier:@"TableSearchResultsNavController"];
self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
self.searchController.searchResultsUpdater = self;
self.searchController.hidesNavigationBarDuringPresentation = NO;
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
//searchResultsController.navigationItem.searchController = self.searchController;
} else {
self.tableView.tableHeaderView = self.searchController.searchBar;
}
}
但是,由于iOS 11中搜索栏的新位置,一旦显示搜索结果,搜索框就会消失,因为它是导航栏的一部分,已被外星人故事板导航控制器取代。
我还修改了一个方法,当搜索栏变为活动状态时调用,如下所示,但搜索栏仍然消失:
// Called when the search bar becomes first responder
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
NSString *searchString = self.searchController.searchBar.text;
[self updateFilteredContentForSearchString:searchString];
if (self.searchController.searchResultsController) {
UINavigationController *navController = (UINavigationController *)self.searchController.searchResultsController;
SearchResultsTableViewController *vc = (SearchResultsTableViewController *)navController.topViewController;
self.searchController.dimsBackgroundDuringPresentation = false;
//my attempt, to no avail
if (@available(iOS 11.0, *)) {
vc.navigationItem.searchController = self.searchController;
} else {
vc.searchController=self.searchController;
}
vc.searchResults = self.searchResults;
[vc.tv reloadData];
}
}
解决这个问题的方法是什么?我希望该应用程序与11之前的操作系统(至少iOS10)保持兼容。
我是否必须完全重写这种机制(如果是,如何?),或者只是简单地告诉控制器N2还显示搜索栏?
感谢您的见解