【问题标题】:Crash while swapping child VC using ViewController Containment使用 ViewController Containment 交换子 VC 时崩溃
【发布时间】:2012-01-19 11:43:07
【问题描述】:

我遇到了一个问题,希望这里有人能提供帮助。

我正在编写一个包含 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];
        }];

}

【问题讨论】:

标签: ios ios5


【解决方案1】:

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

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

希望对您有所帮助。

【讨论】:

  • 感谢 Canopus,我曾尝试禁用 SegmentController 但没有成功(同样的崩溃仍然发生),但我同意你的观点,这可能与 CA 尝试制作动画时的用户交互有关。我会继续搜索,但感谢您的回复。
【解决方案2】:

我尝试使用 transitionFromViewController:toViewController:duration:options:animations:completion: 和使用 completion 块检查标志,但似乎完成块在动画之前完成,即使我将 duration 设置为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多