在2个屏幕导航控制器之间交换视图控制器会导致不一致的层次结构异常

时间:2011-11-24 16:30:22

标签: ios cocoa-touch uikit

我有一个容器视图控制器,它可以并排处理2个导航控制器。我有时需要将一堆视图控制器从一个导航堆栈移动到另一个导航堆栈的底部。

问题是我收到了iOS 5中新增的UIViewControllerHierarchyInconsistency异常。我不知道如何解决这个问题。使用push / pop方法工作正常,但我需要在堆栈中进一步插入内容,以便我访问视图控制器数组本身。代码是:

- (void)swapViewController:(UIViewController *)controller {

    NSMutableArray *leftStack = [NSMutableArray arrayWithArray:_leftNavController.viewControllers];
    NSMutableArray *rightStack = [NSMutableArray arrayWithArray:_rightNavController.viewControllers];

    if ([leftStack containsObject:controller]) {

        // Left to right
        [leftStack removeObject:controller];
        [rightStack addObject:controller];
        [_leftNavController setViewControllers:leftStack];
        [_rightNavController setViewControllers:rightStack];

    } else {

        // Right to left
        [rightStack removeObject:controller];
        [leftStack addObject:controller];
        [_rightNavController setViewControllers:rightStack];
        [_leftNavController setViewControllers:leftStack];

    }

}

完整的例外是:

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<MyViewController: 0x6c4e7f0> should have parent view controller:<UINavigationController: 0x6a5d100> but requested parent is:<UINavigationController: 0x6a58c10>'

1 个答案:

答案 0 :(得分:0)

我有一个response from the developer forums

  

当你抓住UINavigationController的视图控制器并将它们插入另一个导航控制器时,它们仍然在逻辑上位于第一个导航控制器中,因此是例外。

     

为什么不创建新的视图控制器来执行此操作?如果有必要,您可以让它们共享数据或状态,甚至为它们实现完整副本以使其更加简单,但不一致性直接来自于尝试在两个不同的控制器中同时使用视图控制器。

因此,我将处理原始导航控制器并为每次VC转换重新创建它们。