popToRootViewControllerAnimated的问题

时间:2012-05-24 15:21:37

标签: ios uinavigationcontroller uistoryboard uistoryboardsegue

在我的StoryBoard中,我将根视图控制器嵌入到导航控制器中,并在启动应用程序时显示此视图。然后,用户将浏览一系列视图,这些视图基本上是以模态方式呈现的视图控制器。

我正在尝试实现一个函数来返回根视图控制器,所以我调用了

-(IBAction)backToMenu{
    NSLog(@"Back to menu");
    [self.navigationController popToRootViewControllerAnimated:YES];
}

但没有任何反应。如果我NSLog(@"%@", self.navigationController");它会打印null,所以我猜这是我问题的根源。您无法在以模态方式呈现的视图控制器上调用popToRootViewControllerAnimated:

除非您将引用传递给根视图控制器。但这是正确的方法吗?如果是这样,您如何传递对根视图控制器的引用?由于我的所有视图控制器都是UIViewController的自定义子类的实例,我尝试在所述类的代码中插入它:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [[segue destinationViewController] navigationController] = [[segue sourceViewController] navigationController];    
}

但我收到一条错误消息,指出navigationController无法转让。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

dismissViewControllerAnimated:completion:的文档中,它说:

  

如果你连续出现几个视图控制器,那么建立一个   堆栈的呈现视图控制器,在视图上调用此方法   堆栈中较低的控制器会解除其直接的子视图   控制器和堆栈上该子节点上方的所有视图控制器。

这表明您应该保留对根视图控制器的引用(或以其他方式通知它)并在其上调用此方法。 (如果你正在使用它,那么已弃用的dismissModalViewControllerAnimated:也有类似的说明。)

答案 1 :(得分:0)

实现方法-(IBAction)backToMenu的类是否继承自UIViewController?当我实现popToRootViewControllerAnimated的类继承自其他类时,我得到了错误。要保持对原始navigatorController的引用,我会:

  1. 在实现backToMenu的类中声明一个指向导航控制器指针的指针,类似于:UINavigationController *navCon; yo应该将其声明为属性,然后 synthesizeit

  2. 因此,当您为此类实例化ViewController时,您可以执行以下操作:

  3. TheClassViewController *theClassVC = [TheClassViewController alloc] initWithNib:@"TheClassViewController" bundle:nil];

    theClassVC.navCon = self.navigationController; //这是您传递参考资料的地方

    [self.navigationController pushViewController:theClassVC animated:YES];

答案 2 :(得分:0)

刚刚解决了。

问题是,在StoryBoard中,初始视图控制器是嵌入的根视图控制器而不是导航控制器

一旦将导航控制器设置为初始视图控制器(即拖动箭头使其指向它),popToRootViewControllerAnimated就像魅力一样。