10

途中に一種の分岐がある複雑なアプリを構築しています。

アプリのある時点で、特定の 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:直接呼び出しており、 がアニメーションで閉じられ、 がアニメーションなしで消えてしまうことを期待しています。mainVCself.presentingViewController.presentingViewControllerthirdVCsecondVC

Apple が UIViewController クラスのドキュメントで述べているように:

表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる責任があります。提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます。

複数のビュー コントローラーを連続して提示し、提示されたビュー コントローラーのスタックを構築する場合、スタックの下位にあるビュー コントローラーでこのメソッドを呼び出すと、スタックの直接の子ビュー コントローラーとその子の上のすべてのビュー コントローラーが破棄されます。これが発生すると、最上位のビューのみがアニメーション形式で閉じられます。中間のView Controllerはスタックから単純に削除されます。最上位のビューは、そのモーダル遷移スタイルを使用して閉じられます。これは、スタック内の下位にある他のビュー コントローラーで使用されるスタイルとは異なる場合があります。

問題は、それが起こることではないということです。私のシナリオでは、 がthirdVC消え、secondVC従来のモーダル スライドから下へのアニメーションで却下されていることが示されます。

私は何を間違っていますか?


編集 :

だから@codeFiの答えはおそらく古典的なプロジェクトで働いていますが、ここでの問題は私がフレームワークに取り組んでいることです. これmainVCはクライアント アプリにあり、secondVCthirdVCは私のフレームワークの別のストーリーボードにあります。mainVCコード内で参照する以外の方法でアクセスできないため、残念ながらセグエのアンワインドはここではオプションではありません。

4

2 に答える 2

3

私はこれとまったく同じ問題を抱えていましたsecondVC.view。次のように、画面のスナップショットをサブビューとして に追加することで、視覚的に回避することができました。

if (self.presentedViewController.presentedViewController) {
    [self.presentedViewController.view addSubview:[[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]];
}

[self dismissViewControllerAnimated:YES completion:nil];

きれいではありませんが、機能しているようです。

注:ナビゲーション バーがある場合secondVCは、画面のスナップショットを作成してからサブビューとしてスナップショットを に追加するまでの間、ナビゲーション バーを非表示にする必要がありますsecondVC。解雇アニメーション。コード:

if (self.presentedViewController.presentedViewController) {
    UIView *snapshot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
    [self.presentedViewController.navigationController setNavigationBarHidden:YES animated:NO];
    [self.presentedViewController.view addSubview:snapshot];
}

[self dismissViewControllerAnimated:YES completion:nil];
于 2014-11-10T23:16:10.357 に答える
2

同じ問題があり、UnwindSegues を使用して修正しました。

基本的には、セグエしたい ViewController に IBAction Unwind Segue メソッドを追加し、IB で Exit アクションを Unwind Segue メソッドに接続するだけです。

例:

3 つの ViewController (VC1、VC2、VC3) があり、VC3 から VC1 に移動したいとします。

ステップ 1 次のように VC1 にメソッドを追加します。

- (IBAction)unwindToVC1:(UIStoryboardSegue*)sender
{
}

ステップ 2 Interface Builder で VC3 に移動し、それを選択します。次に、VC アイコンから終了アイコンまで CTRL キーを押しながらドラッグし、VC1 に追加したメソッドを選択します。

アンワインド セグエを追加

ステップ 3 IB で VC3 を選択したまま、アンワインド セグエを選択し、属性インスペクタでセグエ識別子を追加します。

ここに画像の説明を入力 ここに画像の説明を入力

ステップ 4 セグエを実行する(または VC を閉じる)必要がある VC3 に移動し、次を追加します。

[self performSegueWithIdentifier:@"VC1Segue" sender:self];
于 2014-09-24T13:40:25.833 に答える