[self.navigationController popToViewController:VC2 动画:NO];碰撞

Posted

技术标签:

【中文标题】[self.navigationController popToViewController:VC2 动画:NO];碰撞【英文标题】:[self.navigationController popToViewController:VC2 animated:NO]; crash 【发布时间】:2014-08-05 09:34:34 【问题描述】:

您好,我正在开发一个我应该去的应用程序:

    UIViewController1 到UIViewController2 从UIViewController2 到UIViewController3 从UIViewController3 到UIViewController4 从UIViewController4 回到UIViewController2

我正在使用UINavigationController。当我使用[self.navigationController pushViewController:VC2 animated:NO];[self.navigationController popViewControllerAnimated:NO]; 时,一切正常。

但是当我使用来自UIViewController4 的[self.navigationController popToViewController:VC2 animated:NO]; 时,应用程序会终止说Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'

以下是我如何弹出到UIViewController2 的代码

for (UIViewController *vc in self.navigationController.viewControllers) 
            if ([vc isKindOfClass:[ViewController2 class]]) 
                UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
                ViewController2 *VC2 = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
                [self.navigationController popToViewController:VC2 animated:NO];
            
        

当我打印导航数组时,它在堆栈中显示UIViewController2。 我已经从 Editor->embed in->Navigation Controller

添加了UINavigationController

谁能告诉我为什么会这样?我试图搜索这个问题,但没有任何帮助

【问题讨论】:

我认为你的 UINavigationController 中没有 VC2 instacne。也许你有 2 个不同的 UIViewController2 实例?尝试调用 [[self.navigationController viewControllers] indexForObject:VC2];和 [VC isKindOfClass:[UIViewController2 class]] 在 for-each 循环中检查我是否正确。 您必须跳转到导航堆栈上的 UIViewController。您正在尝试弹出到新分配的导航控制器。 【参考方案1】:

在这里你实例化了一个新的 VC2 视图控制器实例,这不是你在导航视图控制器堆栈上的实例!

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
            ViewController2 *VC2 = [storyboard     instantiateViewControllerWithIdentifier:@"ViewController2"];

所以你必须在

中找到正确的实例
[[self.navigationController] viewControllers]

解决方案1:(正如iDev所说,跳转到堆栈上的第二个视图控制器,如果您知道它是第二个,请使用它)

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

方案2:(一般回栈上2层)

NSUInteger ownIndex = [self.navigationController.viewControllers indexOfObject:self];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:ownIndex - 2] animated:YES];

【讨论】:

好的答案非常适合我的要求。【参考方案2】:

这是你的代码:

for (UIViewController *vc in self.navigationController.viewControllers) 
    if ([vc isKindOfClass:[ViewController2 class]]) 
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        ViewController2 *VC2 = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
        [self.navigationController popToViewController:VC2 animated:NO];
    

您可能已经发现vcViewController2 的一种,并且已经在导航堆栈中。您创建为ViewController2 中的VC2 的新实例不在导航堆栈中,从来没有

查看异常的主体:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“试图弹出到不存在的视图控制器。”

因此,您希望导航回一个尚未推入导航堆栈的视图控制器——这会导致崩溃。

您必须导航回堆栈中已经的视图控制器——即您的vc

for (UIViewController *vc in self.navigationController.viewControllers) 
    if ([vc isKindOfClass:[ViewController2 class]]) 
        [self.navigationController popToViewController:vc animated:NO];
    

【讨论】:

【参考方案3】:

试试这一行来将你的 viewcontroller 弹出到 2 nd

  [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

【讨论】:

以上是关于[self.navigationController popToViewController:VC2 动画:NO];碰撞的主要内容,如果未能解决你的问题,请参考以下文章

我如何能够推动自己的观点而不必每次都实例化自己

以编程方式导航到另一个视图控制器/场景