Как разрешить контроллеру 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, но до того, как он будет добавлен как дочерний вид (и, таким образом, получит доступ к контроллеру навигации).
Привет, erwald, я столкнулся с той же ситуацией, что и вы. Могли ли вы найти решение? –