15

我有一个像这样设置的视图和控制器。

  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];
}
4

3 回答 3

31

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

相反,您必须通过 App 委托访问应用程序的 NavController。

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

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

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

于 2010-06-29T20:30:13.730 回答
10

您可以使用以下指令:

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

它对我有用:D

于 2014-07-11T06:11:04.460 回答
0

看看 UIViewController 的 navigationController 和 tabBarController 属性。这些将返回给定 UIViewController “所属”的相应 navigationController 或 tabBarController。

因此,您可以执行以下操作:

[customController.navigationController pushViewController:newController animated:YES];
// Similarly for tabBarController ...
于 2010-06-29T15:31:57.957 回答