そうです、コンテナからビューを検索するのではなく、loadView をオーバーライドするだけです。これまでに示したように、イニシャライザまたはプロパティ セッターを介してビューを提供する必要があります。次に、loadView で、次のように挿入されたビューに設定します。
- (void)loadView
{
[self.view = _myInjectedView]; //Do this rather than looking it up via the TyphoonFactory - easier to test.
}
このようにすると:
- UIView からダウンキャストするのではなく、実際のタイプを介してビューを参照できます
- 純粋な単体テストでモックアウトするのは非常に簡単です。( TyphoonPatcher、スウィズリングなどは必要ありません)。
次に例を示します。
- (id)userDetailsController
{
return [TyphoonDefinition withClass:[UserDetailsController class] initialization:^(TyphoonInitializer* initializer)
{
initializer.selector = @selector(initWithSession:userDetailsView:);
[initializer injectWithDefinition:[self session]];
[initializer injectWithDefinition:[self userDetailsView]];
}];
}
- (id)userDetailsView
{
return [TyphoonDefinition withClass:[UserDetailsView class]
properties:^(TyphoonDefinition* definition)
{
//circular dependency. Can also be set within VC.
[definition injectProperty:@selector(delegate)
withDefinition:[self userDetailsController]];
[definition injectProperty:@selector(sideMargin)
withValueAsText:@"${view.field.default.side.margin}"];
}];
}
Xib からの注入
実際に提供できる Xib ファクトリーはまだありません。ここでテーマを発行するオブジェクトと同様のパターンを使用して定義するのは簡単な仕事であるため、Xib ベースのビューごとに DI コンテナーにコンポーネントを用意し、それを直接注入するだけです。
または、新しいTyphoonFactoryProviderを使用することもできます。
行き詰まった場合はお知らせください。Xib-view-factory を作成してプッシュする時間を見つけます。