Container View Controller无法处理Unwind Segue Action

时间:2014-05-28 12:18:32

标签: ios ios6 segue uicontainerview parentviewcontroller

尝试使用从作为子项添加到另一个视图控制器的视图控制器中的自定义segue进行展开时,我遇到了问题。

这是MyCustomSegue.m:

- (void)perform
{
    if (_isPresenting)
    {
        //Present
        FirstVC *fromVC = self.sourceViewController;
        SecondVC *toVC = self.destinationViewController;

        toVC.view.alpha = 0;

        [fromVC addChildViewController:toVC];
        [fromVC.view addSubview:toVC.view];

        [UIView animateWithDuration:1.0 animations:^{

            toVC.view.alpha = 1;
            //fromVC.view.alpha = 0;

        } completion:^(BOOL finished){

            [toVC didMoveToParentViewController:fromVC];

        }];

    }
    else
    {
        //Dismiss
    }
}

这是我的FirstVC.m:

- (void)prepareForSegue:(MyCustomSegue *)segue sender:(id)sender
{
    segue.isPresenting = YES;
}

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
    return self;
}

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    return [[MyCustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController];
}

- (IBAction)unwindToFirstVC:(UIStoryboardSegue *)segue
{
    NSLog(@"I am here");
}

所有必要的连接也在故事板中完成。

我的问题是永远不会调用-segueForUnwindingToViewController:。 一旦返回-viewControllerForUnwindSegueAction:fromViewController:withSender:,我的程序就会崩溃并出现以下异常:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not find a view controller to execute unwinding for <FirstViewController: 0x8e8d560>'

据我所知,崩溃的原因是我希望我的容器视图控制器能够处理展开segue操作,这是不可能的(因为容器视图控制器只询问其子项< / strong>处理放松信号。

这是对的吗? 我该怎么做才能解决我的问题?

谢谢!

2 个答案:

答案 0 :(得分:3)

我不认为你可以用这种方式放松(至少我找不到方法)。相反,你可以创建另一个&#34; normal&#34;从子控制器切换回父级,并将其类型设置为自定义,使用与从第一个控制器到第二个控制器的类相同的类。在第二个控制器的prepareForSegue中,将isPresenting设置为NO,并在自定义segue中包含此代码,

- (void)perform {
    if (_isPresenting) {
        NSLog(@"Presenting");
        ViewController *fromVC = self.sourceViewController;
        SecondVC *toVC = self.destinationViewController;
        toVC.view.alpha = 0;
        [fromVC addChildViewController:toVC];
        [fromVC.view addSubview:toVC.view];

        [UIView animateWithDuration:1.0 animations:^{

            toVC.view.alpha = 1;

        } completion:^(BOOL finished){
            [toVC didMoveToParentViewController:fromVC];
        }];

    }else{
        NSLog(@"dismissing");
        SecondVC *fromVC = self.sourceViewController;
        [fromVC willMoveToParentViewController:nil];
        [UIView animateWithDuration:1.0 animations:^{
            fromVC.view.alpha = 0;
        } completion:^(BOOL finished) {
            [fromVC removeFromParentViewController];
        }];
    }
}

答案 1 :(得分:-1)

如果您想从SecondVC返回到FirstVC,请尝试使用此代码,告诉您的控制器返回上一个控制器。

[self dismissViewControllerAnimated:YES completion:nil];

这将有效,您不需要展开代码。

希望这有助于。