首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带故事板的台风,实例化ViewController

带故事板的台风,实例化ViewController
EN

Stack Overflow用户
提问于 2014-06-14 19:53:20
回答 1查看 1.5K关注 0票数 1

当我在台风中使用故事板时,如果我在程序集中做类似的事情

代码语言:javascript
复制
- (id)myController
{

    return [TyphoonDefinition withClass:[BigController class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(dao) with:[_dataAssembly dao]];
    }];
}

后来,我希望工厂把台风故事板上的控制器交给我,但是我最终得到了使用alloc/init创建的普通控制器。

代码语言:javascript
复制
vc=  [_factory componentForType:[BigController class]];

在AppDelegate中,我使用台风故事板如下所示

代码语言:javascript
复制
TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[[Q_Assembly assembly],[P_Assembly assembly]]];

我可以回到使用StoryboardWithIdentifier...but,我想使用_factory,以便能够从故事板中获得对控制器的引用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-15 06:52:39

您是否尝试过将故事板声明为工厂组件?下面是一个例子:

代码语言:javascript
复制
//Create the factory definition
-(id)myStoryBoard
{
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:
        ^(TyphoonDefinition* definition) {

         [definition useInitializer:@selector(storyboardWithName:factory:bundle) parameters:
            ^(TyphoonInitializer* initializer) {
            [initializer injectParameterWith:@"storyBoardName"];
            [initializer injectParameterWith:self];
            [initializer injectParameterWith:[NSBundle mainBundle]];
         }
         definition.scope = TyphoonScopeSingleton; //Let's make this a singleton
    }
}

//Create definitions that will be emitted by the factory
-(id)firstVc
{
    return [TyphoonDefinition withFactory:[self myStoryBoard] 
    selector:@selector(instantiateViewControllerWithIdentifier:) 
    parameters:^(TyphoonMethod *factoryMethod) {

        [factoryMethod injectParameterWith:@"viewControllerId"];
    }];

您现在应该能够从工厂解析这个组件了。此特性的文档( https://github.com/typhoon-framework/Typhoon/wiki/Types%20of%20Injections#injecting-objects-produced-by-other-components. )

顺便说一句,我注意到您正在使用TyphoonComponentFactory接口解析控制器,这很好。但是,您知道TyphoonComponentFactory可以充当任何一个组装接口吗?因此,您还可以按以下方式进行解析:

代码语言:javascript
复制
UIViewController* viewController = [(MyAssemblyType*) factory firstVc];

。。。这对以下方面特别有用:

  • 这样您就可以注册同一类型的多个组件,并在不使用“魔术字符串”的情况下解析它。
  • 当你注入工厂本身的时候,要在台风上有一个更松的耦合。

示例:

代码语言:javascript
复制
@interface MyListViewController

//In the assembly we inject 'self'. 
//We'll obtain the detail VC using the "domain specific" assembly interface. 
//. . but when injecting self, it can be cast to TyphoonComponentFactory or any of your 
//assembly interfaces
@property(nonatomic, strong, readonly) MyAssembly* assembly;  

@end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24223721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档