我正在构建一个复杂的应用程序,中间有一个分支。
在应用程序中的某个时刻,会出现一个特定的 UIViewController,我们将其称为mainViewController
(缩短mainVC
).
The mainVC
通过代码呈现另一个视图控制器,使用以下代码(出于隐私原因我删除了其中的一部分):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecondaryStoryboard" bundle:secondaryBundle];
SecondViewController *secondVC = [storyboard instantiateInitialViewController];
[self presentViewController:secondVC animated:YES completion:nil];
So the 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
正如你所看到的,这个segue以模态方式呈现了目标视图控制器(通过使用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 类文档中所说:
呈现视图控制器负责关闭视图
它提出的控制器。如果您在呈现的视图上调用此方法
控制器本身,它会自动将消息转发到
呈现视图控制器。
如果您连续呈现多个视图控制器,从而建立一个
呈现的视图控制器堆栈,在视图上调用此方法
堆栈中较低的控制器会解除其直接子视图
控制器以及堆栈上该子级之上的所有视图控制器。
当这个情况发生时,动画中仅忽略最顶层的视图
时尚;任何中间视图控制器都被简单地从
堆。最顶层的视图使用其模态转换被关闭
style,可能与其他视图控制器使用的样式不同
位于堆栈的较低位置。
问题是事实并非如此。在我的场景中,thirdVC
消失,并显示secondVC
被经典的模态滑到底部动画所解雇。
我究竟做错了什么 ?
Edit :
所以@codeFi的答案可能是在一个经典项目中工作,但这里的问题是我正在开发一个框架。所以mainVC
将在客户端应用程序中,并且secondVC
and thirdVC
在我的框架中,在一个单独的故事板中。我无权访问mainVC
除了在我的代码中引用它之外,以任何其他方式,因此不幸的是,展开转场在这里不是一个选项。