問題は、viewController2 が表示されている間 (約 0.2 秒かかります)、アプリ内のイベントによって viewController1 がポップされる可能性があることです。
それから私は得る:
DetailsViewController: 0x7e6191a0 の外観遷移の開始/終了の不均衡な呼び出し。
また、viewController2 は画面上で「孤立」したままになります (削除する方法はありません)。
コードは次のとおりです (Xamarin c# ではありますが、Objective C でも同じ問題です)。
this.PresentViewController(viewController2, animated: true, completionHandler: null); // takes 0.2s to animate
//
// then 0.1s later, say, this is called:
//
this.DismissViewController(animated: false, completionHandler: null);
this.NavigationController.PopToRootViewController(animated: false);
問題は、 this.DismissViewController がまだアニメーション化されている間、実際には viewController2 を閉じないことです。
(プッシュ アニメーションが進行中の場合、同様の問題が発生します)。
解決策は、PopToRootViewController のリクエストを「キューに入れ」、this.PresentViewController の completionHandler で実行することです。しかし、これは非常に面倒で、アプリ内のすべてのイベントをキューに入れる必要があり、すべてのアニメーションに completionHandler が必要です。
DismissViewController が機能し、PopToRootViewController を問題なく呼び出すことができるように、現在のアニメーションをキャンセルする方法が本当に必要です (this.View.Layer.RemoveAllAnimations() は presentViewController では機能しません)。
この「キャンセルできないアニメーション」の問題に人々はどのように対処していますか?
アップデート:
また、関連する問題があり、UIAlert の代わりに UIAlertController を使用する必要があります。背景については、以下を参照してください。
すでにアラートを表示している場合は、UIAlertController を表示します
UIAlertController を表示する前に、presentViewController アニメーションが完了するまで待機する必要があります。これは、アラートで表示したいプッシュ通知のようなものでは困難ですが、アニメーション中に到着する可能性があります。