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

15

我的视图和控制器设置如下:

  1. 标签/栏控制器
  2. 1.中有一个根视图控制器
  3. 2.中有一个程序创建的导航控制器,它作为子视图显示在根视图控制器中。

我想做的是访问顶部的tab bar / 导航控制器,以便我可以将一个视图推送到它上面。

我尝试使用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个回答

31

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

相反,你必须通过App delegate来获取应用程序的NavController。

YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:nextViewController animated:YES];
你正在使用你的UIApplication的单例对象(包含了关于你的app的各种好信息),它有一个.delegate属性指向AppDelegate,并且AppDelegate包含对NavigationController的引用。无论如何,这就是“Navigation-based Application”Xcode模板建立NavController所有权的方法。如果您自己创建了模板,您的情况可能会有所不同,但是如果您能够自己创建模板,您可能不需要问这个问题。

1
使用iOS 4.0作为部署目标时,代码“del.navigationController”会导致构建错误:“在非结构体或联合体中请求成员navigationController”。 - Marcel Falliere
@Marcel,你的应用程序委托有一个命名属性作为导航控制器,对吗? - Dan Ray
1
错误:在类型为'AppDelegate *'的对象上未找到属性'navigationController'。 - Gelldur
只有在您将导航控制器存储在应用程序委托中时,此方法才有效。这不是标准做法。 - Mike C.

10

您可以使用以下指令:

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

对我而言它可行 :D


0

请查看UIViewController的navigationController和tabBarController属性。它们将返回给定UIViewController“所属”的相应navigationController或tabBarController。

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

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

1
我有点困惑你的意思是什么。堆栈看起来像这样:1.导航控制器->根视图控制器->2.导航控制器->A视图控制器。我的目标是让A视图控制器将一个新的视图控制器推到1.导航控制器,但无论我尝试什么,它都会把它推到2.导航控制器上?如果这能更清楚一些,不好意思。 - Matt
嘿,我更新了我的帖子以匹配你的评论。堆叠两个导航控制器有点奇怪,因为一个做同样的事情。无论如何,请查看我的建议,因为它可能有效,但我不确定百分之百。 - nebs
很抱歉我知道这很奇怪,我没有真正提供背景。我有一个带有3个选项卡/控制器的标签栏控制器。 1. 首页 2. 搜索 3. 设置。在根视图中,有3个不同的表格,每个表格都有导航控制器->表格视图控制器。这些显示警报、观察列表和先前的搜索。因此,在观察列表视图控制器中,当您按下查看文档箭头时,我希望它接管顶部导航控制器,以便显示整个屏幕。但不幸的是,你给我的那段代码没有起作用。 - Matt
好的,我对你实际想要的东西感到困惑。你所说的“接管顶部导航控制器以便它显示整个屏幕”是什么意思?你最初的问题是如何从其中一个堆叠的视图控制器中访问导航控制器,为此你可以使用navigationController属性。因此,你可以从任何一个堆叠的视图控制器中调用navigationController来访问“父级”导航控制器。也许你可以编辑你的原始问题并提供更多细节,因为我不确定我完全理解了你的意思。 - nebs
抱歉,不是接管,只是推一个视图。我的问题是如何获取原始堆栈,而不是第二个堆栈。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接