Typhoon - 如何注入xib文件中定义的UIView?

时间:2013-12-10 11:55:54

标签: typhoon

我想在我的视图控制器中注入一个视图,以便在单元测试中注入模拟视图(WPDependencyInjectorImplementation是我的TyphoonAssembly子类)。

我理想的loadView方法如下所示:

- (void)loadView {
    WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly defaultAssembly];
    self.view = [injectorAssembly someView];
}

我不确定这个定义是什么样的,或者是否可能,因为从xib创建视图的代码如下:

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"WPSomeView" owner:nil options:nil];
return [views firstObject];

1 个答案:

答案 0 :(得分:1)

这是正确的,你只是覆盖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工厂。使用与发出主题here的对象类似的模式来定义一个应该是一个快速的工作,因此您将在每个基于Xib的视图的DI容器中都有一个组件,并且只需注入直。

或者,您可以使用新的TyphoonFactoryProvider

如果您遇到困难,请告诉我们,我们其中一人会找一些时间来为您创建和推送Xib-view-factory。