2012-05-01 9 views
2

私はビューコントロール階層にiOS 5ストーリーボードを使用しています。これの問題は、ビューコントローラに注入する必要があるビジネスロジックを処理するいくつかの共有コントローラクラスがあることです。これらのコントローラは初期化され、アプリケーションデリゲートに保持されます。iOSのストーリーボードと注入プロパティー

例えば、私はいくつかのView Controllerで使用しているDropboxインタラクションをカプセル化したコントローラを持っています。私は各prepareForSegue:sender:で参照を渡すことができますが、これはコントローラ全体のビューコントローラの階層に依存します。また、私はシングルトンのパターンを使うことができましたが、私はそれを本当に熱狂させていません。

コントローラを疎結合したい場合、私の選択肢は何ですか?私は異議申し立てについて聞いたことがありますが、私はそれを検討していますが、どんな入力も非常に歓迎されるでしょう。

答えて

0

私は少し遅れますが、うまくいけば他人を助けることができます。

プロトコルを使用してこの問題を解決し、注入するオブジェクトが特定のセレクタに応答していることを確認しました。私は2つのいずれかの操作を行いprepareForSegue方法で

id object = segue.destinationController; 
if([object conformsToProtocol:@protocol(HasApplicationManager) ]){ 
    [(id<HasApplicationManager>)object setApplicationManager:_applicationManager]; 
} 
if([object respondsToSelector:@selector(setViewDelegate:)]){ 
    [object performSelector:@selector(setViewDelegate:)withObject:self]; 
} 

第1ビットをチェックし、宛先コントローラは、指定されたプロトコルに準拠した場合は、構図パターンを使用してアプリケーションを構築するため、これはまだ疎結合であります。

第2に、私はセレクタをチェックします。これはプロトコルよりも非公式であり、おそらくより結合され、より多くの問題を提示します。しかし、それは何百もの「IHave ...」プロトコルを持ち歩く方法です。

+0

この問題は、コールビューコントローラに責任を委ねることが問題です。 1つのビューコントローラが複数のビューコントローラによって使用される場合を考える。これは、各ビューコントローラで行わなければならない。 – mkko

+0

それは良いことです。したがって、各親ビューコントローラは、その子を異なるように構成できます。たとえば、ビュー・コントローラがオブジェクトの所定のセットをレンダリングした場合、親ビュー・コントローラはそれを別々に構成できます。これにより、多くの拡張性が可能になります。 – MrJD

+0

設定可能性は素晴らしく、それがDIフレームワークが目指すものです。問題は変更によるものです。これは基本的にコードの複製と同じです。もう1つのことは、DIではクラス内で必要なリソースを定義するのが非常に便利で、提供されることです。この種の手動注入では、ユーザーの誤操作が多く発生します。私はこれが後で不足しているプロパティを注入するいくつかのユーティリティに拡張することができると思う。しかし、私はこれを実装する方法はまだ分かりません。 – mkko

関連する問題