3

ストーリーボードを使用して「子」という名前のビュー コントローラーを作成したいので、次のように定義します。

- (TyphoonStoryboard *)storyBoard
{
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) {
        [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) {
            [initializer injectParameterWith:@"Storyboard"];
            [initializer injectParameterWith:self];
            [initializer injectParameterWith:[NSBundle mainBundle]];
        }];
        definition.scope = TyphoonScopeSingleton; //Let's make this a singleton
    }];
}

- (ChildViewController *)childViewControllerFromStoryboard
{
    return [TyphoonDefinition withFactory:self.storyBoard selector:@selector(instantiateInitialViewController)];
}

子View Controllerを含むルートView Controllerがあります

- (RootViewController *)rootViewController {
    return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) {
        [definition useInitializer:@selector(initWithChildViewController:) parameters:^(TyphoonMethod *initializer) {
            [initializer injectParameterWith:self.childViewControllerFromStoryboard];
        }];
    }]; 
}

最後の部分は、子ビュー コントローラーの依存関係を挿入するだけです。

- (ChildViewController *)childViewController {
    return [TyphoonDefinition withClass:[ChildViewController class] configuration:^(TyphoonDefinition *definition) {
        // Initilization doesn't work.
        [definition useInitializer:@selector(initWithData:) parameters:^(TyphoonMethod *initializer) {
            [initializer injectParameterWith:self.data];
        }];
        // Property injection does.
        // [definition injectProperty:@selector(data)]
    }];
}

非常に正常です。イニシャライザを使用しているだけですが、呼び出されることはありません。initWithCoder:絵コンテに指定されたものを常に使用しているからだと思います。

質問:

  1. ストーリーボードでView Controllerイニシャライザを使用することは可能ですか? appDelegate に似た no のように見えます。
  2. これは、ストーリーボードをアセンブリから直接使用する最も簡単な方法ですか?
  3. 複数のストーリーボードがある場合、ストーリーボードをパラメトリックに定義する方法はありますか? のようなもので終わりたくありませんstoryBoard1, storyBoard2, ..., storyBoardN

前もって感謝します。

4

2 に答える 2

2

ストーリーボード定義のコードを減らすために、次のTyphoonDefinitionようなカテゴリを追加します。

@implementation TyphoonDefinition (Storyboard)

+ (TyphoonStoryboard *)withStoryboardName:(NSString *)storyboardName factory:(TyphoonComponentFactory *)factory
{
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) {
        [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) {
            [initializer injectParameterWith:storyboardName];
            [initializer injectParameterWith:factory];
            [initializer injectParameterWith:[NSBundle mainBundle]];
        }];
        definition.scope = TyphoonScopeSingleton; //Let's make this a singleton
    }];
}

@end

これはアセンブリの外部にあるため、複数回登録されることはありません。

于 2014-10-31T23:17:19.800 に答える