我正在开发一个比较复杂的应用程序,在中间有一个分支。
在应用程序的某个时刻,会呈现一个特定的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];
那么,我直接在self.presentingViewController.presentingViewController中引用的mainVC上调用dismissViewControllerAnimated:来期望使用动画解散thirdVC,并使secondVC仅消失而不使用动画。如苹果在UIViewController类文档中所述,呈现视图控制器负责解雇它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,则会自动将消息转发到呈现的视图控制器。如果您依次呈现多个视图控制器,则构建一个呈现的视图控制器堆栈,调用此方法会解散堆栈中较低的视图控制器及其上面的所有视图控制器的直接子视图控制器。当这种情况发生时,仅以动画方式解除最顶部的视图;任何中间视图控制器都将从堆栈中删除。使用其模态转换样式解雇最顶部的视图,该样式可能与堆栈中较低的其他视图控制器使用的样式不同。问题在于这不是发生的事情。在我的场景中,第三个VC消失了,并且显示出第二个VC正在通过经典的模态向下滑动动画解散。我做错了什么?编辑:因此,@codeFi的答案可能适用于经典项目,但问题在于我正在使用框架。因此,mainVC将在客户端应用程序中,并且secondVC和thirdVC位于我的框架中,在单独的storyboard中。我无法以任何方式访问mainVC,而仅以代码中的引用方式,因此无法使用展开退步。