从子视图导航控制器访问顶部导航控制器

Mat*_*att 15 iphone subview uinavigationcontroller navigationcontroller

我有我的观点和控制器设置如此.

  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];
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*Ray 30

嵌套的ViewController(即,在实际位于NavController堆栈上的ViewController控制的视图内)不能直接访问其父视图的控制器是其堆栈成员的UINavigationController.这是句子中的一个,但它的意义是:你不能从这里到达那里.

相反,你必须通过App委托获得应用程序的NavController.

YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:nextViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

您正在使用UIApplication的单例(包含有关您的应用程序的各种有用信息),它具有指向AppDelegate的.delegate属性,并且包含对NavigationController的引用.

无论如何,这就是"基于导航的应用程序"Xcode模板如何设置NavController的所有权.YMMV,如果你自己推出 - 虽然如果你这样做,你可能不需要问这个问题.


JER*_*ERC 10

您可以使用以下指令:

[(UINavigationController *)self.view.window.rootViewController pushViewController:vc animated:YES];
Run Code Online (Sandbox Code Playgroud)

它对我有用:D