Я создаю сложное приложение, имеющее ветку посередине.
В какой-то момент в приложении представлен конкретный UIViewController, мы назовем его mainViewController
(сокращенно mainVC
).
mainVC
представляет собой другой контроллер представления по коду, использующему следующий код (я вырезал его части из соображений конфиденциальности):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecondaryStoryboard" bundle:secondaryBundle];
SecondViewController *secondVC = [storyboard instantiateInitialViewController];
[self presentViewController:secondVC animated:YES completion:nil];
Таким образом, secondVC
позже представит другой контроллер представления, называемый thirdVC
. Это делается с помощью пользовательского перехода, установленного в раскадровке, используемой в приведенном выше коде, который выглядит следующим образом:
@implementation VCCustomPushSegue
- (void)perform {
UIView *sourceView = ((UIViewController *)self.sourceViewController).view;
UIView *destinationView = ((UIViewController *)self.destinationViewController).view;
UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
destinationView.center = CGPointMake(sourceView.center.x + sourceView.frame.size.width, destinationView.center.y);
[window insertSubview:destinationView aboveSubview:sourceView];
[UIView animateWithDuration:0.4
animations:^{
destinationView.center = CGPointMake(sourceView.center.x, destinationView.center.y);
sourceView.center = CGPointMake(0 - sourceView.center.x, destinationView.center.y);
}
completion:^(BOOL finished){
[self.sourceViewController presentViewController:self.destinationViewController animated:NO completion:nil];
}];
}
@end
Как вы можете видеть, этот переход модально представляет целевой контроллер представления (с помощью presentViewController:
) с пользовательской анимацией (слайд справа налево).
Так что в принципе до сих пор все в порядке. Я представляю secondVC
с классической модальной анимацией (слайд вверх снизу) и представляю thirdVC
с моим пользовательским переходом.
Но когда я хочу отклонить thirdVC
, я хочу вернуться прямо к mainVC
. Поэтому я вызываю следующее из thirdVC
:
self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:_animate completion:nil];
Таким образом, я вызываю dismissViewControllerAnimated:
непосредственно на mainVC
(на который ссылается self.presentingViewController.presentingViewController
), и я ожидаю, что thirdVC
будет отклонено с анимацией, а secondVC
просто исчезнет без анимации.
Как Apple говорит в документации по классу UIViewController:
Представляющий контроллер представления отвечает за отклонение представленного им контроллера представления. Если вы вызываете этот метод на самом представленном контроллере представления, он автоматически перенаправляет сообщение на представляющий контроллер представления.
Если вы представляете несколько контроллеров представления последовательно, таким образом создавая стек представленных контроллеров представления, вызов этого метода на контроллере представления, расположенном ниже в стеке, отклоняет его непосредственный дочерний контроллер представления и все контроллеры представления выше. этот дочерний элемент в стеке. Когда это происходит, только самый верхний вид удаляется анимированным образом; любые промежуточные контроллеры представления просто удаляются из стека. Самый верхний вид закрывается с использованием его модального стиля перехода, который может отличаться от стилей, используемых другими контроллерами представлений, расположенными ниже в стеке.
Проблема в том, что это не то, что происходит. В моем сценарии thirdVC
исчезает и показывает, что secondVC
закрывается с классической модальной анимацией слайда вниз.
Что я делаю неправильно ?
Изменить:
Так что ответ @codeFi, вероятно, работает в классическом проекте, но проблема здесь в том, что я работаю над фреймворком. Таким образом, mainVC
будет в клиентском приложении, а secondVC
и thirdVC
в моем фреймворке, в отдельной раскадровке. У меня нет доступа к mainVC
каким-либо иным образом, кроме ссылки на него в моем коде, поэтому, к сожалению, здесь нет возможности раскручивать переходы.