我已经在我的应用中成功实现了UISearchController
。我在要在以下位置使用的视图的viewDidLoad
方法中将其设置为:
_profileSearchView = [self.storyboard instantiateViewControllerWithIdentifier:@"profileListView"];
[_profileSearchView initSearchController];
self.navigationItem.titleView = _profileSearchView.searchController.searchBar;
initSearchController
方法初始化搜索控制器,它是_profileSearchView
的属性,并且位于_profileSearchView
中:- (void) initSearchController {
_searchController = [[UISearchController alloc] initWithSearchResultsController:self];
_searchController.delegate = self;
_searchController.hidesNavigationBarDuringPresentation = NO;
_searchController.searchBar.delegate = self;
_searchController.searchBar.searchBarStyle = UISearchBarStyleMinimal;
_searchController.searchBar.showsCancelButton = YES;
_searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
}
如果我在导航控制器的根视图中使用它,则效果很好。但是,如果我推送视图并尝试在其中使用它,则搜索控制器不会变为 Activity 状态,并且该错误会显示在控制台中:
Warning: Attempt to present <UISearchController: 0x7fb113605220> on <RootViewController: 0x7fb11318a6d0> whose view is not in the window hierarchy!
它抱怨的RootViewController是我从中推送的根视图。为什么这仅在根视图中有效?
UPDATE :根视图控制器具有
self.definesPresentationContext = YES;
(推送视图也具有),当我从根视图中删除ojit_code时,搜索控制器将在推送视图上工作。不幸的是,这还破坏了其他一些事情,因此我需要保留它。那么如何允许根视图和推送视图都具有单独的功能搜索控制器? 最佳答案
该问题是由具有self.definesPresentationContext = YES;
的根视图和推送视图引起的。解决方案是添加以下内容:
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.definesPresentationContext = NO;
}
并在显示视图时确保它是
YES
:-(void) viewWillAppear:(BOOL)animated {
self.definesPresentationContext = YES;
}
在根视图中。根视图仍然能够正确地推送来自其自己的搜索控制器的搜索结果,推送视图也是如此。
关于ios - 在推送 View 上使用UISearchController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37489189/