2

ストーリーボードを使用して、多くのトランジションを含む大きなアプリケーションがあります。トランジションは右から左に行う必要があるので、カスタムセグエを作成して実行しました。

通常のトランジションを使用すると、ナビゲーションスタックにプッシュした各View Controllerは、ポップするまで保持されます。

カスタムセグエを使用している間、前のコントローラー(現在のコントローラーをプッシュするコントローラー)は保持されません。ポップバックすると、コントローラーのインスタンスは別のメモリアドレスを取得します。これは、ポインターが変更されたことを示します。

これはカスタムプッシュセグエです:

UIViewController *sourceViewController = (UIViewController*)[self         sourceViewController];
UIViewController *destinationController = (UIViewController*)[self   destinationViewController];

CATransition* transition = [CATransition animation];
transition.duration = .3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

[sourceViewController.navigationController.view.layer addAnimation:transition
                                                            forKey:kCATransition];

[sourceViewController.navigationController pushViewController:destinationController animated:NO];

とカスタムポップセグエ:

UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
UIViewController *destinationController = (UIViewController*)[self destinationViewController];

CATransition* transition = [CATransition animation];
transition.duration = .3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

[sourceViewController.navigationController.view.layer addAnimation:transition
                                                            forKey:kCATransition];

[sourceViewController.navigationController pushViewController:destinationController animated:NO];

私はこの方法でセグエを実行します:

[self performSegueWithIdentifier:@"SearchToMenu" sender:self];

何も機能していないようで、オンラインで何も見つかりませんでした。

さらにコード例やスクリーンショットなどを提供する必要がある場合は、お知らせください。

4

1 に答える 1

0

popViewControllerは、ポップではなくプッシュしています。

この行:

 [sourceViewController.navigationController pushViewController:destinationController animated:NO];

する必要があります:

[sourceViewController.navigationController popViewControllerAnimated:NO];

カスタムセグエは以前のコントローラーを保持します。ただし、セグエのdestinationControllerは、常に新しくインスタンス化されたオブジェクトです。新しいコントローラーに対して異なるメモリアドレスを取得していることに気づきましたが、[self.navigationController viewControllers]スタックを確認すると、元のviewControllerがまだそこにあり、スタック上に3つのオブジェクトがあることがわかります。この修正されたバージョンでは、意図したとおり、viewContollerのそのインスタンスに戻ります。

そのため、標準のプッシュセグエを使用して、スタックの下位に戻ることは絶対にしないでください。ストーリーボードはこれが起こることを示唆しますが、それは幻想です:あなたは前のviewControllerのクラスの新しいインスタンスにナビゲートしているだけです。同じストーリーボードレイアウトを使用しているため、初期状態では前の状態とまったく同じように見えます。

あなたの例は、セグエをまったく使用しない方がよい場合の良い例です。この時点で混乱するだけでなく、ポップバックするときに、prepareForSegueで「destinationViewController」を構成しようとしても、ポップバックされたviewControllerには影響しません。また、ストーリーボードは、どのviewControllerがどのNavControllerに含まれているかを追跡できなくなるため、混乱していることに気付いたかもしれません。navBarsとそれらを構成する機能がまったく失われます(ストーリーボードでは、navBarsはまだアプリにあります)。

于 2012-12-20T02:28:34.083 に答える