使用ViewController Containment交换子VC时发生崩溃

时间:2012-01-19 11:43:07

标签: ios ios5

我遇到了一个我希望有人可以提供帮助的问题。

我正在编写一个包含ViewController遏制的应用。当用户操作SegmentedController时,主控制器将各种子控制器交换进出。

它似乎工作正常,但我发现了一个漏洞。如果我选择快速分段,我可以使应用程序崩溃并出现以下错误:

2012-01-19 04:29:39.539 MyApp [1057:fb03] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'子视图控制器(ChildViewController1):调用时,0x6e91480和ChildViewController1:0x6e8dca0必须有一个共同的父视图控制器 - [UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]'

它看来问题是我在动画运行时触发动作(并且子控制器被换入和换出),这就是问题,但我不确定如何保护在动画运行时执行此操作的UI。任何想法将不胜感激。这是运行VC交换的代码:

- (IBAction)selectPage:(id)sender {
    NSLog(@"Page Selected");   
    UIViewController *newViewController = [[self patientChartViewControllers] objectAtIndex:[sender selectedSegmentIndex]];
    [self addChildViewController:newViewController];
    [[self navigationItem] setTitle:[newViewController title]];
    [self transitionFromViewController:[self currentPatientChartViewController] toViewController:newViewController duration:0.50 options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{
            [[[self currentPatientChartViewController] view] removeFromSuperview]; 
            newViewController.view.frame = self.view.bounds; 
            [[self view] addSubview:[newViewController view]];
        } 
        completion:^(BOOL finished){ 
            [newViewController didMoveToParentViewController:self]; 
            [[self currentPatientChartViewController] removeFromParentViewController]; 
            [self setCurrentPatientChartViewController:newViewController];
        }];

}

2 个答案:

答案 0 :(得分:3)

我不太确定,但我认为视图控制器之间的转换是由Core Animation框架处理的,出于某种原因,Core Animation不喜欢在与用户交互时做多件事 - 所有同时。

为了防止这种情况发生,我的理解是,你的SegmentedController(可能是UISegmentControl的一个实例)保留在视图中,同时正在交换视图。对于交换视图的时间,您可以禁用SegmentController的用户交互,以便用户无法切换视图 - 他们必须等待视图A到B的完全转换。

希望有所帮助。

答案 1 :(得分:0)

我尝试使用transitionFromViewController:toViewController:duration:options:animations:completion:使用完成块进行标记检查,但即使我设置持续时间,它似乎也会在动画播放前完成。到0。

如果用户正在快速更改子视图控制器,我认为我们应该自己添加和删除子视图控制器,以避免动画。这对我有用

像这样的东西

// Removing currentVC
[currentVC willMoveToParentViewController:nil];
[currentVC.view removeFromSuperview];
[currentVC removeFromParentViewController];

// Adding nextVC
[self addChildViewController:nextVC];
nextVC.view.frame = self.view.bounds;
[self.view addSubview:nextVC.view];
[nextVC didMoveToParentViewController:self];
self.currentVC = nextVC