データ モデルにエンティティを追加するカスタム URL スキームを実装しています。エンティティの詳細は URL に含まれています。基本的な考え方は、電子メール リンク (または別のアプリからのリンク) でアプリが開き、新しいエンティティが追加されるというものです。
問題は、応答時にアプリがどの状態になるかを確認できないことです。任意の数のビュー コントローラーが表示される可能性があります。エンティティのリストが表示されている場合は、そのエンティティの新しい行を挿入する必要があります。他のビューが画面に表示されている場合は、別の方法で対応する必要があります。一部のビューはモーダルである場合もあります。
これが発生した場合、単純なパターンで満足できます。ユーザーが現在行っていることは何でも中止し、ルート ビュー コントローラーにポップします。ここから、追加された新しいエンティティを表示するコントローラにプッシュします。
表示されているモーダルを常に閉じてルートにポップすることを実験しました。これは、表示されているものを正確に知る必要がないという利点があります。
[(UINavigationController *)self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
[(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO];
これはかなりうまく機能しますが、不十分な場合が少なくとも 2 つあります。
- モーダルが提示されたときに何らかのオブジェクトが作成された場合 (モーダルは新しいオブジェクトを変更するために使用されます)、ユーザーがキャンセルした場合にオブジェクトを削除するのはデリゲートの責任であり、エンティティは存続します。
- が表示されている場合
UIActionSheet
、すべての賭けはオフです。これを表示したコントローラーを知り、そのコントローラーにアクセスし、アクション シートを閉じるようにメッセージを送信しない限り、これを閉じることはできません。そうしないと、ルート ビュー コントローラーがポップされますが、アクション シートは画面に表示されたままになります。それを表示したコントローラーがなくなっているため、アクションシートを続けてタップすると、もちろんクラッシュが発生します。
どうすればこれを確実に処理できますか? 現在表示されているView Controllerを特定して、各シナリオを順番に処理する必要がありますか? または、コントローラーを追加したり、アプリケーションのフローを変更したりするたびに更新する必要のない、よりスケーラブルなソリューションはありますか?