64位iOS设备中的UIViewControllerHierarchyInconsistency问题

4
我正在开发一款iPad应用程序,它有一个单一的视图控制器(称为ContentViewController),其中包含3个不同的视图。
1.滑块视图——从底部打开,其中包含图标列表。根据所选的图标,我必须在内容视图中加载一个视图控制器。 2.控制视图——屏幕左侧带有几个按钮和文本。 3.容器视图——这覆盖了屏幕的大部分区域,我想根据从滑块选择的图标加载视图控制器。
以下是我的实现方式:
在应用程序启动时(首次),我通常会在容器视图中加载主页视图控制器,该主页视图控制器具有与应用程序相关的项目表格视图。每个视图控制器都在导航控制器内,并将该导航控制器加载到容器视图中。
当我在滑块视图中选择一个图标时,我正在加载一个视图控制器。
下面是我在名为ContentViewController的视图控制器中实现此功能的代码:
- (void) itemSelected: (UIViewController *) viewController
{
   // I am storing view controller in a instance variable currentViewController. The currentViewController is declared as @property (nonatomic , strong) UIViewController *currentViewController under @interface in header file
   if(_currentViewController == nil)
   {
      // This part of code gets executed for the first time, when there is no view controller available in ContainerView
      _currentViewController = viewController;
      [self addChildViewController:_currentViewController];
      [self.containerView addSubview:_currentViewController.view];
   }
   else if(_currentViewController != viewController)
   {
       // If a view controller is already opened in Container View and when I click a icon from the slider, this par of code is getting executed
       [self addChildViewController:viewController];
       [self transitionFromViewController:_currentViewController
                      toViewController:viewController
                              duration:0
                               options:UIViewAnimationOptionTransitionNone
                            animations:^{}
                            completion:^(BOOL finished){
                                [_currentViewController removeFromParentViewController];
                                _currentViewController = viewController;
                                [_currentViewController   didMoveToParentViewController:self];
                            }
     ];        
    }
}

上述代码在iPad2和iPad3(32位设备)中运行良好。但是当我在iPad Air(64位设备)上运行此应用程序时,在transitionFromViewController中崩溃并抛出以下错误:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UINavigationController: 0x136d76130> should have parent view controller:(null) but actual parent is:<ContentViewController: 0x136d39680>'
*** First throw call stack:
(0x183642950 0x19001c1fc 0x183642890 0x186688f00 0x18661484c 0x186613ff4 0x10009a224 0x1001104c8 0x18673d798 0x1867fe234 0x186692470 0x1865fe4a4 0x1836030a8 0x183600330 0x1836006bc 0x1835416d0 0x1891ddc0c 0x186672fdc 0x100058028 0x19060faa0)
libc++abi.dylib: terminating with uncaught exception of type NSException

我尝试了不同的选项,例如删除transitionFromViewController并用以下代码替换:
    [_currentViewController willMoveToParentViewController:nil];
    [_currentViewController removeFromParentViewController];
    _currentViewController = firstView;
    [_currentViewController didMoveToParentViewController:self];

    [self addChildViewController:_currentViewController];
    [self.containerView addSubview:_currentViewController.view];

但是在iPad Air上最后一行 [self.containerView addSubview....] 再次崩溃,出现了与上述相同的错误。我不确定该如何继续,也不知道为什么这个问题只会出现在64位设备上。请问有人能帮我解决这个问题吗?
提前感谢!
Vignesh
1个回答

3

通过更改代码,我能够解决这个问题。在之前的代码中,我将视图控制器作为子视图控制器添加,并从父视图中删除了先前的视图控制器。这段代码在非 64 位设备上运行良好,但在 64 位设备上不起作用。因此,我只需将视图控制器的视图添加到容器视图的子视图中,并从超级视图中删除之前的视图控制器。以下是修改后的参考代码:

if(_currentViewController == nil)
{
    _currentViewController = viewController;
    [self.containerView addSubview:viewController.view];
}
else if(_currentViewController != viewController)
{
    [_currentViewController.view removeFromSuperview];
    [self.containerView addSubview:viewController.view];
    _currentViewController = viewController;
}

它在所有设备上都可以正常工作。

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