Доступ к верхнему навигационному контроллеру из навигационного контроллера 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 ...