Доступ к верхнему навигационному контроллеру из навигационного контроллера Subview
У меня есть мои представления и контроллеры, настроенные так.
- Контроллер Tab/Bar
- Внутри 1. есть контроллер корневого представления.
- в пределах 2. представляет собой программно созданный навигационный контроллер, который отображается как подчиненный в контроллере корневого представления.
То, что я пытаюсь сделать, - это получить доступ к верхней панели вкладок/навигационному контроллеру, чтобы я мог нажать на нее.
Я попробовал parentViewController, но все, что он сделал, это нажать вид на запрограммированный навигационный контроллер.
любые предложения?
Вот как я настроил свой контроллер корневого представления:
-(void)viewDidAppear:(BOOL)animated{
NSLog(@"ROOT APPEARED");
[super viewDidAppear:animated];
WorklistViewController *worklistController = [[WorklistViewController alloc]initWithNibName:@"WorklistView" bundle:[NSBundle mainBundle]];
UINavigationController *worklistNavController = [[UINavigationController alloc] initWithRootViewController:worklistController];
worklistNavController.navigationBar.barStyle = UIBarStyleBlackOpaque;
worklistNavController.view.frame = watchlistView.frame;
[worklistNavController.topViewController viewDidLoad];
[worklistNavController.topViewController viewWillAppear:YES];
[self.view addSubview:worklistNavController.view];
GetAlertRequestViewController *alertsController = [[GetAlertRequestViewController alloc]initWithNibName:@"AlertsView" bundle:[NSBundle mainBundle]];
UINavigationController *alertsNavController = [[UINavigationController alloc] initWithRootViewController:alertsController];
alertsNavController.navigationBar.barStyle = UIBarStyleBlackOpaque;
alertsNavController.view.frame = alertsView.frame;
[alertsNavController.topViewController viewDidLoad];
[alertsNavController.topViewController viewWillAppear:YES];
[self.view addSubview:alertsNavController.view];
}
Ответы
Ответ 1
Вложенный ViewController (т.е. внутри представления, контролируемого ViewController, который фактически находится в стеке NavController) не имеет прямого доступа к UINavigationController, что его родительский контроллер представления является членом стека. Это одно РАТИРОВАНИЕ предложения, но смысл его в том, что вы не можете добраться отсюда.
Вместо этого вам нужно попасть в приложение NavController через делегат приложения.
YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:nextViewController animated:YES];
Вы используете синтаксис UIApplication (содержит всевозможные сведения о вашем приложении), который имеет свойство .delegate, указывающее на AppDelegate, и содержит ссылку на NavigationController.
Таким образом, шаблон Xcode на основе навигации "Навигационное приложение" в любом случае устанавливает право собственности NavController. YMMV, если вы откажетесь самостоятельно, хотя, если вы это сделали, вам, вероятно, не нужно будет задавать этот вопрос.
Ответ 2
Вы можете использовать следующую инструкцию:
[(UINavigationController *)self.view.window.rootViewController pushViewController:vc animated:YES];
Это работает для меня: D
Ответ 3
Посмотрите на свойства UIViewController navigationController и tabBarController. Они вернут соответствующий navigationController или tabBarController, которым данный UIViewController "принадлежит".
Итак, вы можете сделать что-то вроде:
[customController.navigationController pushViewController:newController animated:YES];
// Similarly for tabBarController ...