Storyboard中的Navigation Controller继承自根控制器(iOS11)

时间:2017-11-14 08:11:53

标签: ios objective-c uitableview uisearchbar ios11

在我的应用程序中,我有一个导航控制器(N1),用搜索栏控制一个tableview控制器(T1)。 当搜索栏变为活动状态时,将从故事板中显示新的导航控制器(N2)以显示搜索结果。 (见图)

storyboard

这完全正常,直到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还显示搜索栏?

感谢您的见解

0 个答案:

没有答案