1

これが私がやろうとしていることです。Apple マップ アプリからのリクエストを処理するルーティング アプリを作成しています。マップ アプリは、次のメッセージをアプリ デリゲートに送信することでこれを行います。

- (BOOL) application: (UIApplication *) application openURL:(NSURL *) url sourcApplication:(NSString *)sourceApplication annotation:(id)annotation

問題は、私のアプリが既に実行されていて、この時点でどのような状態になっているかということです。ナビゲーション スタックの奥深くに複数のレイヤーがある可能性があります。また、ナビゲーション スタックにルート コントローラーが 1 つしかない可能性もありますが、モーダル ビューが現在それを覆っています。

どこにいても、すべてのView Controllerをポップして、最上位のView Controllerを1つだけ保持したいのですが、これはその方法を知っています。しかし、モーダル ビューがある場合はそれを却下したいのですが、その方法がわかりません。

モーダル ビュー (または、可能性のあるモデル ビューが複数ある場合、そうではありませんが、質問のためにそれを求めています) がそれをカバーしているかどうかをどのように知ることができますか? そして、私はそれを却下したいですか?アプリデリゲートから直接アクセスできますか? 現在、ナビゲーション スタックの最上位のビュー コントローラーにモーダル ビュー コントローラーのポインター参照を保持し、参照が nil でない場合はビュー コントローラーを破棄しています。アプリ デリゲートは、最上位のビュー コントローラーにこのジョブを実行するように要求するだけです。

これは適切ですか?

4

1 に答える 1

2

ナビゲーション コントローラーを使用している場合は、簡単にアクセスしてtopViewcontroller、アプリケーション デリゲート クラスから別のビュー コントローラーが提示されているかどうかを確認できます。iOS 6.0 までは、そのために使用したいアクセサーは「modalViewController」でしたが、それ以降は非推奨としてマークされているため、使用する必要がありますpresentedViewController

このようなチェックの例は、次のようになります。

// after rearranging view controller hierarchy, check for modal view controllers

UIViewController *topVc = [navigationController topViewController];
if ([vc presentedViewController] != nil) {
    [vc performSelector:@selector(dismissModalViewControllerAnimated:) 
             withObject:[NSNumber numberWithBool:YES]
             afterDelay:0.5];
}

を少し遅らせて呼び出すdismissModalViewControllerAnimated:と (少し調整した方がよい場合があります)、View Controller の再配置によるアニメーションの破損を防ぐことができます。これらの変更をアニメーション化しない場合は、関数を直接呼び出すだけで十分です。

存在する場合はそれを無視することは、必要な機能を実現するための適切な方法です。

于 2013-07-23T08:02:22.603 に答える