iOS が同じ ViewController を連続してプッシュおよびポップすると、システムは何をしているのでしょうか?

最近PUSHやPOP VCにハマっているのですが、どういう仕組みになっているのか知りたいです

参考までにいくつかの実験をしてみましょう

まずテストコードは以下の通りです 1つのメソッドで連続した複数のpushとpop操作を実行します self.residentVCもネイティブのUIViewControllerです ここでは主に各種VCを構築することが目的です

ここには 3 回のプッシュと 1 回のポップがあり、すべてのアニメーションがオフになっています

システムの Pop メソッドと Push メソッドをフックしたので、ログを通じて対応する呼び出しシーケンスを確認できます。たとえば、上記のコードは次のようにログを出力します。

ログを見ると、navigationController が VC を 1 つずつプッシュし、次に最上位の VC をポップしていることがわかります。すべてが期待どおりです。

これを変更して、pop メソッドを [self.navigationController PopToViewController:selfanimated:NO] に変更することもできます。または、

[self.navigationController PopToRootViewControllerAnimated:NO]; 効果は同じなので、ここにはスクリーンショットはありません

上記のことから、皆さんの予想と完全に一致していますが、アニメーションはすべて NO であるという詳細があります。アニメーションは主にアニメーション効果で、ほとんどがオープンになっています。オープンにすると、効果は異なりますか?

次に、最初のプッシュのアニメーションを [はい] に設定します。

奇妙なことが起こりました。プッシュの最初の vc は 3 回プッシュ呼び出しを行い、次にポップを実行しました。残りの 2 つのプッシュ操作とポップ操作はすべて正常でした。最終結果が正しいという事実に特に注意してください。注目してください。 currentVC、ここでは一連の操作後の最終結果を指します

次に、最初と 2 回目のプッシュのアニメーションを [はい] に設定します。

奇妙なことが再び起こりました。ただし、最初のプッシュでは 3 回のプッシュと 1 回のポップが発生し、2 回目のプッシュでは 2 回のプッシュと 1 回のポップが発生し、最後のプッシュは正常でした。

currentVC は正しいです:

次に、1 回目、2 回目、3 回目のプッシュのアニメーションを [はい] に設定します。

奇妙なことが再び起こりました。最初のプッシュで 3 回のプッシュと 1 回のポップが発生し、2 回目のプッシュで 2 回のプッシュと 1 回のポップが発生し、最後のプッシュで 1 回、1 回ポップし、最後に再びポップしました。

currentVC はまだ正しいですが、ここにはスクリーンショットはありません

Push と Pop が何度も呼び出されても、最終結果は依然として正しい

最後に、最初、2 回目、3 回目のプッシュと最後のポップのアニメーションを [はい] に設定します。効果は上記と同じです。この観点から、ポップのアニメーションが有効かどうかは結果に影響しません。それ自体は最後のステップであるため、アニメーションは影響を与える要素ではありません。

これは、同じ VC を連続してプッシュとポップした場合、アニメーションがない場合は呼び出しシーケンスに異常がないことを示していますが、アニメーションを追加するとプッシュとポップの両方が複数回呼び出されることになります。プッシュとポップの数は変わりません。

実際、システムのポップを調べたところ、最後のポップを除いて、返される vc はポップされた vc であり、残りの戻り値は nil であることがわかりました。有効なポップを取得したい場合は、戻り値が nil かどうかを確認するのは良い方法です。

ここにプッシュします。詳細があります。すでにスタック上にある vc を再度プッシュすることはできず、エラーが報告されます。

したがって、有効なプッシュをキャプチャしたい場合は、プッシュされた vc を保存するスタックを作成する必要があります。スタックに既に vc がある場合、後続の vc を保存する必要はありません。

おすすめ

転載: blog.csdn.net/killer1989/article/details/107472864