2014-10-31 73 views
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)]; 
} 

我必须将包含子视图根视图控制器控制器

- (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. 可以使用视图控制器的初始化故事板?它看起来不是,类似于AppDelegate。
  2. 这是从装配中直接使用故事板的最简单方法吗?
  3. 如果我有几个故事板,是否有参数化定义故事板的方法?我不想最终得到像storyBoard1, storyBoard2, ..., storyBoardN这样的东西。

在此先感谢。

回答

5

感谢您对台风的关注!

  1. 可以使用视图控制器的初始化故事板?它看起来不是,类似于AppDelegate。

不,你不能初始化对象两次(你可以调用init方法两次,但很奇怪和不正确的,可以是错误的原因)。

从Xib/Storyboard创建的每个UIViewController和UIView都使用initWithCoder:初始化方法。

相反,您可以使用方法注入并注入setData:或使用属性注入。

  1. 这是直接从程序集中使用故事板的最简单方法吗?

不是。最简单的方法是使用plist bootstrapping。 (当在Info.plist中指定的初始故事板名称)

检查指导这里:

https://github.com/typhoon-framework/Typhoon/wiki/Obtaining-Built-Components#first-bootstrap-typhoon-using-either

但如果你有不止一个故事板,那么你可以指定的plist初始,和其他在部件。

  1. 如果我有几个故事板,是否有参数化定义故事板的方法?我不想结束像storyBoard1,storyBoard2,...,storyBoardN。

是的,你可以使用运行参数对于台风的功能。 使用运行时参数的定义变得

- (TyphoonStoryboard *)storyBoardWithName:(NSString *)name 
{ 
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { 
     [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:name]; // <-- runtime argument injection 
      [initializer injectParameterWith:self]; 
      [initializer injectParameterWith:[NSBundle mainBundle]]; 
     }]; 
    }]; 
} 

难道你问什么?

+0

感谢您的及时响应!关于答案: 1.完全可以。 2.我已经在使用plist,但仍然需要创建一个包含故事板中VC的根VC。 3.我已经尝试过了,但它在'validateScope'中引发了一个异常,说“运行时参数注入只适用于原型和对象图的作用域定义,但为定义设置:TyphoonStoryboard” – 7ynk3r 2014-10-31 18:29:02

+0

2.您是否正在使用plist故事板(UIMainStoryboardFile plist键)?在这种情况下,根视图控制器自动设置。 3.正确。你确定你在这里需要单身吗? Storyboard已经由其生成的viewControllers保留。 – Aleksey 2014-10-31 18:34:03

+0

2.在我的情况下,根视图控制器是一个没有故事板的自定义视图控制器。 3.删除单例作用域后,我收到'doRegistration'中的错误'Key'storyboardWithName:'已经注册了' – 7ynk3r 2014-10-31 20:05:10

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 

因为这是它不注册一次以上的组件之外。

+0

我对了吗在假设为工厂参数,你只需传递'self'? – fatuhoku 2015-02-14 17:16:12

相关问题