0

長いタイトルで申し訳ありませんが、これは私が思いついた最も正確で説明的なバージョンです。

iOS 5 とストーリーボードを使用して、カスタム セグエ タイプのカスタム コンテナー ビュー コントローラーを実装しています。また、UINavigationControllerDelegate のように機能することを目的とした、含まれているビュー コントローラーのデリゲート プロトコルも提供します。現在、特定のアクションを実行するために知る必要があるカスタム セグエに関連する状態を、セグエから子ビュー コントローラーに通知するカスタム コンテナーからデリゲート メッセージを送信しています。

これは、.h ファイルのプロトコルに準拠するように指定できる、独自の UIViewController サブクラスを使用するだけで十分簡単です。

ただし、カスタム コンテナーに含まれるビュー コントローラー自体が組み込みコンテナー (UINavigationController、UITabBarController など) である場合、送信しているデリゲート メッセージは、そのコンテナーに含まれているとは限りませんが、アクティブな子ビューには意味があります。そのコンテナが現在表示しているコントローラ。ビルトイン コンテナは明らかに通常のview(Will|Did)(Disa|A)ppear呼び出しをその子に転送しますが、その転送をカスタム メッセージに拡張する一般的な方法がわかりません。

手っ取り早い解決策は、その組み込みコンテナーをサブクラス化し、デリゲート メッセージ転送を追加することです。たとえば、MyTabBarControllerはデリゲート プロトコルに準拠し、デリゲート メッセージをその に転送しますselectedViewController。別の方法として、カスタム コンテナに含まれるビュー コントローラがそれ自体のタイプのコンテナであるかどうかをカスタム コンテナが積極的にスニッフィングすることもできますが、これはさらに汚れており、いつかカスタム コンテナ内にネストされる可能性のある将来のコンテナ タイプを考慮することができません。

このカスタムの封じ込めの配置全体は、現在のアプリに非常に固有のものであるため、要件が何であるかを知っており、これを汎用にする必要がないので、ハックすることができますが、この分野の優れた設計慣行に従いたいと思います将来のアプリでの再利用の可能性を通じて、将来的に大幅に一般化する必要がある場合に備えて。

では、すでに説明した 2 つの解決策以外に何か提案はありますか?

4

2 に答える 2

1

私は正式なプロトコルを使用し、親が子供と通信したい場合は、プロトコルに準拠しているかどうかを尋ねます. カテゴリに似ていますが、カテゴリ メソッドを呼び出すたびに e インスタンスに問い合わせる必要はありません。一度プロトコルに応答するかどうかを尋ねるだけで、必要なプロトコル メソッドを呼び出すことができます。

NSObject の を参照してください-conformsToProtocol:

于 2013-01-09T04:05:25.467 に答える
0

もう少し考えて、少し実験した後、3 番目のアプローチであるカテゴリを思いつきました。まだ私が望むほど一般的ではありませんが、以前のものからステップアップし、組み込みコンテナーコントローラーのサブクラス化に依存しなくなりました。

特定のニーズに合わせて、タブ バー コントローラーでデリゲート メッセージを選択したビュー コントローラーに転送する必要がありました。UITabBarController に MessageForwarding というカテゴリを作成し、正しいメソッド シグネチャを実装しました。カテゴリ メソッドは、同じ呼び出しを に転送しself.selectedViewController、結果を返しています。

次に、カスタム コンテナー クラスにこのカテゴリをインポートすると、ほら、タブ バー コントローラーが魔法のように正しく動作し、コンテナーで送信したデリゲート メッセージを転送するようになりました。

同様のカテゴリは、分割ビューとナビゲーション コントローラー、および使用したいカスタム コンテナーに実装するのは簡単です。

于 2012-09-25T13:16:40.303 に答える