Контроллер представления контейнера не может обрабатывать действие Unwind 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>'

Насколько я понимаю, причина сбоя заключается в том, что я хочу, чтобы мой контроллер представления контейнера обрабатывал действие раскрутки перехода, что невозможно (поскольку контроллер представления контейнера запрашивает только его потомки чтобы справиться с раскруткой.

Это правильно? Что я могу сделать, чтобы решить мою проблему?

Спасибо!


person user-123    schedule 28.05.2014    source источник
comment
Итак, в основном вы хотите вернуться к предыдущему контроллеру, не так ли?   -  person Matt Murdock    schedule 28.05.2014
comment
Да, я хочу вернуться из secondVC в firstVC   -  person user-123    schedule 28.05.2014
comment
Я разместил ответ ниже. Проверьте это и сообщите мне.   -  person Matt Murdock    schedule 28.05.2014


Ответы (2)


Я не думаю, что вы можете использовать раскрутку таким образом (по крайней мере, я не мог найти способ). Вместо этого вы можете создать еще один «обычный» переход от дочернего контроллера обратно к родительскому и установить его тип на пользовательский с тем же классом, который вы использовали для перехода от первого контроллера ко второму. В prepareForSegue во втором контроллере установите для isPresenting значение NO и добавьте этот код в свой собственный переход,

- (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];
        }];
    }
}
person rdelmar    schedule 28.05.2014

Если вы хотите вернуться от SecondVC к FirstVC, попробуйте использовать этот код, где вы говорите своему контроллеру вернуться к предыдущему контроллеру.

[self dismissViewControllerAnimated:YES completion:nil];

Это будет работать, и вам не понадобится раскручивать код.

Надеюсь это поможет.

person Matt Murdock    schedule 28.05.2014
comment
Нет, это не работает. Я не представил SecondVC, я добавил его как дочерний элемент в первый контроллер представления, поэтому моя работа - отклонить его с помощью моего пользовательского перехода... - person user-123; 28.05.2014