0

私が書いた多くのアプリケーションでは、現在表示されているコントローラーへの参照がないクラスからコントローラーをモーダルに提示しなければならないことが何度もありました。(たとえば、製品のダウンロードの進行状況を表示するために使用されるコントローラーを提示する StoreKit トランザクション オブザーバー)。

Three20 では、 を使用し- [TTNavigator visibleViewController]て作業を完了できますが、フレームワークを使用したくない場合はどうすればよいでしょうか? のように動作するカスタム関数を再実装する必要がありTTNavigatorますか? おそらくApple APIに同様の方法がありますか? たとえば、アプリケーション内のすべてのコントローラーに共通の親クラスを作成し、それを使用NSNotificationCenterしてアプリケーション全体のすべての通知を処理する方がよいでしょうか? (もちろん、これには、1 つのクラスに無関係なコードが含まれるという副作用があります)

Apple がこの基本的な機能を彼の標準 API で提供していないことに、私は本当に驚いています。それとも、この問題が繰り返し発生するという事実は、設計手法が不適切であることを示しているのでしょうか?

4

1 に答える 1

1

必ずしも正しいとは限りませんが、おそらく正しい方向に進むことができるいくつかの考え: 私があなたの問題を正しく理解していれば、基本的には、ある時点 (完了時など) にモーダル ビューを表示する必要がある具体的なアクションがありますが、上記のアクションには、現在画面に表示されているView Controllerへの参照がありません(たとえば、バックグラウンドでタスクを実行していて、ユーザーにプログラムをナビゲートさせ、完了時にユーザーに警告したい場合など) .

これをどのように回避するかは、アプリケーションの全体的なアーキテクチャによって異なると思います。ほとんどのアプリには、ナビゲーションを制御するルート ビュー コントローラーがあります。おそらくUITabBarController、アプリ デリゲートで作成した があり、すべてのナビゲーションがそのコントローラーから取得されます。この最上位ビュー コントローラーを介してモーダル ビュー コントローラーを表示することができます (おそらく、アプリ デリゲート内でこれを行うことになります)。

または、モーダル ビュー コントローラーを表示するという考えを手放し、ビューをアプリケーション ウィンドウに直接アタッチすることもできます。かなり人気のあるライブラリをMBProgressHUD見ると、すべてのビュー コントローラーが置かれているアプリ ウィンドウに提供されるモーダル ローディング ビューをアタッチできることがわかります。

したがって、あなたが望むものを達成するためのさまざまな戦略がたくさんあります。モーダル ダイアログを表示する必要があり、どのビュー コントローラーが現在表示されているかがわからない場合があるため、問題がアプリの設計の悪さの結果であるとは必ずしも言えません。つまり、ダウンロードの進行状況を示すStoreKitトランザクションオブザーバーの例では、個別のアクション(製品の購入など)の後にトリガーされると想定され、どのビューコントローラーからトリガーされたかがわかります.

于 2011-04-20T09:33:44.723 に答える