長いタイトルで申し訳ありませんが、これは私が思いついた最も正確で説明的なバージョンです。
iOS 5 とストーリーボードを使用して、カスタム セグエ タイプのカスタム コンテナー ビュー コントローラーを実装しています。また、UINavigationControllerDelegate のように機能することを目的とした、含まれているビュー コントローラーのデリゲート プロトコルも提供します。現在、特定のアクションを実行するために知る必要があるカスタム セグエに関連する状態を、セグエから子ビュー コントローラーに通知するカスタム コンテナーからデリゲート メッセージを送信しています。
これは、.h ファイルのプロトコルに準拠するように指定できる、独自の UIViewController サブクラスを使用するだけで十分簡単です。
ただし、カスタム コンテナーに含まれるビュー コントローラー自体が組み込みコンテナー (UINavigationController、UITabBarController など) である場合、送信しているデリゲート メッセージは、そのコンテナーに含まれているとは限りませんが、アクティブな子ビューには意味があります。そのコンテナが現在表示しているコントローラ。ビルトイン コンテナは明らかに通常のview(Will|Did)(Disa|A)ppear
呼び出しをその子に転送しますが、その転送をカスタム メッセージに拡張する一般的な方法がわかりません。
手っ取り早い解決策は、その組み込みコンテナーをサブクラス化し、デリゲート メッセージ転送を追加することです。たとえば、MyTabBarController
はデリゲート プロトコルに準拠し、デリゲート メッセージをその に転送しますselectedViewController
。別の方法として、カスタム コンテナに含まれるビュー コントローラがそれ自体のタイプのコンテナであるかどうかをカスタム コンテナが積極的にスニッフィングすることもできますが、これはさらに汚れており、いつかカスタム コンテナ内にネストされる可能性のある将来のコンテナ タイプを考慮することができません。
このカスタムの封じ込めの配置全体は、現在のアプリに非常に固有のものであるため、要件が何であるかを知っており、これを汎用にする必要がないので、ハックすることができますが、この分野の優れた設計慣行に従いたいと思います将来のアプリでの再利用の可能性を通じて、将来的に大幅に一般化する必要がある場合に備えて。
では、すでに説明した 2 つの解決策以外に何か提案はありますか?