我已经在我的应用中成功实现了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/

10-16 14:08