途中に一種の分岐がある複雑なアプリを構築しています。
アプリのある時点で、特定の 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 クラスのドキュメントで述べているように:
表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる責任があります。提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます。
複数のビュー コントローラーを連続して提示し、提示されたビュー コントローラーのスタックを構築する場合、スタックの下位にあるビュー コントローラーでこのメソッドを呼び出すと、スタックの直接の子ビュー コントローラーとその子の上のすべてのビュー コントローラーが破棄されます。これが発生すると、最上位のビューのみがアニメーション形式で閉じられます。中間のView Controllerはスタックから単純に削除されます。最上位のビューは、そのモーダル遷移スタイルを使用して閉じられます。これは、スタック内の下位にある他のビュー コントローラーで使用されるスタイルとは異なる場合があります。
問題は、それが起こることではないということです。私のシナリオでは、 がthirdVC
消え、secondVC
従来のモーダル スライドから下へのアニメーションで却下されていることが示されます。
私は何を間違っていますか?
編集 :
だから@codeFiの答えはおそらく古典的なプロジェクトで働いていますが、ここでの問題は私がフレームワークに取り組んでいることです. これmainVC
はクライアント アプリにあり、secondVC
とthirdVC
は私のフレームワークの別のストーリーボードにあります。mainVC
コード内で参照する以外の方法でアクセスできないため、残念ながらセグエのアンワインドはここではオプションではありません。