Доступ к главному навигационному контроллеру из навигационного контроллера подпредставления - PullRequest
15 голосов
/ 29 июня 2010

У меня есть мои представления и контроллеры, настроенные так.

  1. Контроллер табуляции / панели
  2. В пределах 1. находится контроллер корневого представления
  3. в пределах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];
}

Ответы [ 3 ]

30 голосов
/ 30 июня 2010

Вложенный ViewController (т. Е. Внутри представления, контролируемого ViewController, который фактически находится в стеке NavController), не имеет прямого доступа к UINavigationController, членом которого является родительский элемент представления представления.Это одно ГЛОТКО предложение, но смысл его таков: вы не можете добраться отсюда.

Вместо этого вам нужно попасть в NavController приложения через делегата приложения.

YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:nextViewController animated:YES];

Вы используете синглтон вашего UIApplication (содержит все виды полезной информации о вашем приложении), который имеет свойство .delegate, указывающее на AppDelegate, и который содержит ссылку на NavigationController.

Этотак шаблон Xcode «Приложение на основе навигации» устанавливает владение NavController в любом случае.YMMV, если вы покатили свой собственный - хотя, если бы вы сделали, вам, вероятно, не нужно будет задавать этот вопрос.

10 голосов
/ 11 июля 2014

Вы можете использовать следующую инструкцию:

[(UINavigationController *)self.view.window.rootViewController pushViewController:vc animated:YES];

Это работает для меня: D

0 голосов
/ 29 июня 2010

Посмотрите на свойства UIViewController navigationController и tabBarController. Они будут возвращать соответствующий navigationController или tabBarController, которому «принадлежит» данный UIViewController.

Так что вы можете сделать что-то вроде:

[customController.navigationController pushViewController:newController animated:YES];
// Similarly for tabBarController ...
...