如何让子视图控制器将UISearchBar添加到父UINavigationController中?

时间:2015-04-17 13:47:42

标签: ios uinavigationcontroller uisearchbar uisearchdisplaycontroller

如何让子视图控制器修改导航控制器?

我现在面对这个问题,并且找不到有效的解决方案,更不用说运行良好的解决方案了。

基本上,我现在有一个UINavigationController,其中包含UITableViewController,导航栏中有一个搜索栏。到目前为止一切都很好 - 一切运作良好。

但是,我想有时在导航栏和表格视图顶部之间显示一些自定义视图。为此,我认为最好创建另一个视图控制器(让它称之为ContainerViewController),由导航控制器提供。此容器视图控制器将表视图控制器保存为子项,并可以插入它希望的任何自定义视图。视图控制器层次结构应如下所示:

UINavigationController
    ContainerViewController
        UITableViewController (with UISearchDisplayController)

现在我遇到了一个问题,因为UISearchDisplayController的搜索栏应该显示在导航栏中(通过调用didSetupSearchDisplayController),但我显然希望保留所有与之相关的逻辑UITableViewController。我需要容器视图控制器来作为这里的中间人。我试图解决这个问题,但尚未设法解决问题。

以下是我如何实例化表视图控制器并将其作为子容器添加到容器视图控制器中。

- (void)viewDidLoad {
    [super viewDidLoad];

    // Load view controller from storyboard
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    self.contentViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyListViewController"];
    self.contentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

    // Add its view to the content view
    [self addChildViewController:self.contentViewController];
    [self.container addSubview:self.contentViewController.view];
    [self.contentViewController didMoveToParentViewController:self];

    // Set up constraints
    [self.contentViewController.view autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];
}

在子视图控制器中,我注意到self.navigationController中的viewDidLoad为零,但didMoveToParentViewController中没有。{1}}。以下是有效的:

- (void)didMoveToParentViewController:(UIViewController *)parent {
    // Hide separator below navigation bar
    self.navigationController.navigationBar.clipsToBounds = YES;
}

但我无法将搜索栏设置为在导航栏中显示,也无法在子视图控制器中设置导航栏标题(带self.title = ...)。

感谢任何帮助。

编辑:以下是我在UITableViewController(包含的视图)中使用的一些代码,用于创建搜索显示控制器:

UISearchBar *searchBar = [[UISearchBar alloc] init];
self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

// Show search bar in navigation bar (instead of in its own bar underneath)
self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

// Set self as delegate to search display controller and its table view
self.searchDisplayController.delegate = self;
self.searchDisplayController.searchResultsDelegate = self;

我尝试在viewDidLoadself.navigationController为零,在didMoveToParentViewController中存在导航控制器,但这似乎并不重要。我的猜测是,在实例化子视图之后但在将其添加为子视图之前,displaysSearchBarInNavigationBar魔法发生了(因此可以访问导航控制器)。

2 个答案:

答案 0 :(得分:0)

你能用

吗?
self.parentViewController.navigationController

从容器视图中获取对导航控制器的引用?

答案 1 :(得分:0)

这可以帮助您找到答案。我们使用它来设置导航控制器的标题

self.navigationItem.title=@"Name of view goes here";

您应该可以使用self.navigationItem获取导航栏的句柄。