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

时间:2010-06-29 15:21:57

标签: iphone uinavigationcontroller subview navigationcontroller

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

  1. 标签/栏控制器
  2. 1.是根视图控制器
  3. 2. li中的
  4. 是一个以编程方式创建的导航控制器,在根视图控制器中显示为子视图。
  5. 我要做的是访问顶部标签栏/导航控制器,以便我可以将视图推到它上面。

    我尝试了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 个答案:

答案 0 :(得分:30)

嵌套的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如果你自己推出 - 虽然如果你这样做,你可能不需要问这个问题。

答案 1 :(得分:10)

您可以使用以下说明:

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

它对我有用:D

答案 2 :(得分:0)

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

所以你可以这样做:

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