Доступ к лучшему контроллеру навигации от контроллера навигации подпредставления

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

  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];
}
15
задан Matt 29 June 2010 в 18:17
поделиться

2 ответа

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

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

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

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

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

30
ответ дан 1 December 2019 в 00:59
поделиться

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

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

[customController.navigationController pushViewController:newController animated:YES];
// Similarly for tabBarController ...
0
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: