设置navigationController.viewControllers会稍后搞砸堆栈

时间:2014-02-15 15:28:58

标签: ios iphone objective-c navigationcontroller

我遇到了一个奇怪的问题。 将navigationController.viewControllers设置为viewControllers等于当前UIViewController.viewControllers的新数组,然后尝试转换为新的viewController(推送segue),UIViewController.viewControllers搞砸了。

确切地说, 我做了以下事情:

-(void)viewWillAppear:(BOOL)animated
{
...
    for(int i=0; i<[self.navigationController.viewControllers count]; i++)
    {
        NSLog(@"Befor: %d: %@",i, [[self.navigationController.viewControllers objectAtIndex:i] description]);
    }
    [[self navigationController] setViewControllers:[NSArray arrayWithObjects:[self.navigationController.viewControllers objectAtIndex:0], self,nil] animated:NO];
    NSLog(@"After: Num of view controllers: %d", [self.navigationController.viewControllers count]);
    for(int i=0; i<[self.navigationController.viewControllers count]; i++)
    {
        NSLog(@"After: %d: %@",i, [[self.navigationController.viewControllers objectAtIndex:i] description]);
    }

}

记录结果:

  

Befor:观点控制人数:2 2014-02-15 17:15:01.144 [827:60b] Befor:0:20​​14-02-15 17:15:01.145 [827:60b] Befor:1:2014 -02-15 17:15:01.147 [827:60b]之后:观点控制器的数量:2 2014-02-15 17:15:01.148 [827:60b]之后:0:20​​14-02-15 17:15: 01.149 [827:60b]之后:1:

然后我按下了一个按钮,该按钮会移动到另一个viewController。 就在segue之前,这段代码叫做:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"prepareForSegue: Num of view controllers: %d", [self.navigationController.viewControllers count]);
    for(int i=0; i<[self.navigationController.viewControllers count]; i++)
    {
        NSLog(@"prepareForSegue: %d: %@",i, [[self.navigationController.viewControllers objectAtIndex:i] description]);
    }
...

}

记录结果:

  

2014-02-15 17:15:05.388 [827:60b] prepareForSegue:视图控制器数量:1   2014-02-15 17:15:05.389 [827:60b] prepareForSegue:0:

我监控了目的地navigationController.viewControllers的{​​{1}},似乎viewController消失了。 当试图返回时(使用导航控制器后退按钮),事情变得很难看。

我注意到当我分配一个对象与当前rootViewController不同的数组时,所有这些都不会发生,所以现在这是一种解决方法。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

看看你的故事板。很可能,推送的视图控制器实际上是模态的并且包装在它自己的导航控制器中。

比较显示意外数量的视图控制器的两个导航控制器的地址:可能它们不同,在这种情况下,您应该检查添加新导航控制器的位置。