0

Как разрешить контроллеру child view изменять навигационный контроллер?Как разрешить контроллеру child view добавить UISearchBar в родительский UINavigationController?

Я столкнулся с этой проблемой прямо сейчас и не смог найти решение, которое работает, не говоря уже о том, что работает хорошо.

В принципе, прямо сейчас у меня есть 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. Таким образом, следующие работы:

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

Но я не могу установить панель поиска для отображения в панели навигации, и я не могу установить заголовок панели навигации (с self.title = ...) внутри контроллера зрения ребенка.

Поблагодарили бы за любую помощь.

EDIT: Вот код, я использую в 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; 

Я пытался сделать это как в viewDidLoad, где self.navigationController является нулевым , и в didMoveToParentViewController, где существует контроллер навигации, но, похоже, это не имеет значения. Я предполагаю, что волшебство displaysSearchBarInNavigationBar произошло после того, как был создан экземпляр child, но до того, как он будет добавлен как дочерний вид (и, таким образом, получит доступ к контроллеру навигации).

+0

Привет, erwald, я столкнулся с той же ситуацией, что и вы. Могли ли вы найти решение? –

ответ

0

вы можете использовать

self.parentViewController.navigationController 

, чтобы получить ссылку на навигационном контроллере внутри контейнера зрения?

+0

Вы имеете в виду изнутри внутреннего вида? Мне действительно не нужно ссылаться на него. Я думаю, что все это должно быть сделано «автоматически» при добавлении контроллера отображения поиска, нет? Я отредактирую свой ответ с некоторым кодом, который я там использую. – erwald

0

Это может помочь вам найти ответ.Мы используем это, чтобы установить название нашего навигационного контроллера

[email protected]"Name of view goes here"; 

Вы должны быть в состоянии использовать self.navigationItem, чтобы получить дескриптор панели навигации.