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