在推送视图上使用UISearchController

时间:2016-05-27 17:23:49

标签: ios uisearchcontroller

我已在我的应用中成功实施了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);
}

如果我在导航控制器的根视图中使用它,这可以正常工作。但是,如果我推送视图并尝试在那里使用它,搜索控制器就不会变为活动状态,并且此错误会显示在控制台中:

Warning: Attempt to present <UISearchController: 0x7fb113605220> on <RootViewController: 0x7fb11318a6d0> whose view is not in the window hierarchy!

它所抱怨的RootViewController是我推出的根视图。为什么这只在根视图中工作?

更新:根视图控制器有self.definesPresentationContext = YES;(推送视图也有),当我从根视图中删除它时,搜索控制器在推送视图上工作。不幸的是,这也打破了其他一些事情,所以我需要把它留下来。那么我如何允许每个根视图和推送视图都有一个单独的功能搜索控制器?

3 个答案:

答案 0 :(得分:5)

问题是由具有self.definesPresentationContext = YES;的根视图和推送视图引起的。解决方案是添加:

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.definesPresentationContext = NO;
}

并在视图显示时确保它为YES

-(void) viewWillAppear:(BOOL)animated {
    self.definesPresentationContext = YES;
}

在根视图中。根视图仍然可以正确地从其自己的搜索控制器推送搜索结果,推送视图也是如此。

答案 1 :(得分:0)

由于您需要在初始化中访问某些视图帧信息,因此需要将该初始化(或其一部分)移动到viewWillAppear,其中所有视图都已准备好显示。在ViewdidLoad视图中,只能加载到内存中,因此无法获取帧属性。

viewDidLoad中:

_profileSearchView = [self.storyboard instantiateViewControllerWithIdentifier:@"profileListView"];

viewWillAppear中:

[_profileSearchView initSearchController];
self.navigationItem.titleView = _profileSearchView.searchController.searchBar;

答案 2 :(得分:0)

来自Apple Documentation

  

实例属性

definesPresentationContext
     

一个布尔值,指示此视图控制器的视图是否为   在视图控制器或其后代之一呈现时覆盖   查看控制器。

按下新控制器视图时,请将此属性设置为false。这个节目解决了你的问题。

聚苯乙烯。当旧视图控制器再次可见时,请记住再次将属性设置为true。