我遇到了一个我希望有人可以提供帮助的问题。
我正在编写一个包含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];
}];
}
答案 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