在没有故事板

时间:2015-07-17 20:58:36

标签: ios objective-c typhoon

我使用故事板和plist集成测试Typhoon,在我的程序集中定义依赖项并按预期工作。 例如,当从ViewControllerA到ViewControllerB执行push segue时,正在正确注入ViewControllerB的依赖项。我已经看到了instantiateViewControllerWithIdentifier被调整以注入属性。

但是,我也有遗留代码,不使用故事板。它使用XIB。 例如,LegacyViewControllerA推送LegacyViewControllerB:

这是LegacyViewControllerA中的代码:

LegacyViewControllerB *legacyVCB = [[LegacyViewControllerB alloc] initWithNibName:@"LegacyViewControllerB" bundle:[NSBundle mainBundle]];
legacyVCB.paramOne = ...
legacyVCB.paramTwo = ...
[self.navigationController pushViewController:legacyVCB animated:YES];

这是集会:

- (LegacyViewControllerB *)legacyVCB
{
    return [TyphoonDefinition withClass:[LegacyViewControllerB class]
                          configuration:^(TyphoonDefinition *definition) {
                              [definition injectProperty:@selector(apiClient)
                                                    with:[self myApiClient]];
    }];
}

调试LegacyViewControllerB的viewDidLoad,我希望已经注入了apiClient依赖项,但事实并非如此。为什么呢?

编辑:

我已经检查了示例应用程序,我想知道是否有办法避免在ViewControllers中了解程序集和/或导入Typhoon。其实我真的很喜欢与故事板的整合,因为我没有提到Typhoon。

那么,让我们说我没有任何故事板,那么注入ViewController的唯一方法就是执行以下操作?

MyApplicationAssembly *assembly = [[MyApplicationAssembly new] activate];
LegacyViewControllerB *legacyVCB = [assembly legacyVCB];
[self.navigationController pushViewController:legacyVCB animated:YES];

并且必须将我的程序集修改为以下内容:

- (LegacyViewControllerB *)legacyVCB
{
    return [TyphoonDefinition withClass:[LegacyViewControllerB class]
                          configuration:^(TyphoonDefinition *definition) {
                              [definition useInitializer:@selector(initWithNibName:bundle:)
                                              parameters:^(TyphoonMethod *initializer) {
                                                  [initializer injectParameterWith:@"LegacyViewControllerB"];
                                                  [initializer injectParameterWith:[NSBundle mainBundle]];
                                              }];
                              [definition injectProperty:@selector(apiClient)
                                                    with:[self myApiClient]];
    }];
}

然而,这对我来说也不起作用:[assembly legacyVCB]正确地返回注入myApiClient的LegacyViewControllerB实例,但是当推送它时,LegacyViewControllerB的viewDidLoad没有注入它。似乎推送它会创建一个新的LegacyViewControllerB,因为内存地址不同。 为什么你认为这种情况正在发生?

提前致谢。

1 个答案:

答案 0 :(得分:0)

Typhoon挂钩进入UIStoryboard,以便它像常规故事板一样工作,并且注入了依赖关系,但由于Typhoon是依赖注入容器,获取注入实例的正常方法是通过装配界面询问台风。

  • 将程序集注入到想要呈现非故事板控制器的故事板视图控制器中。
  • 向程序集询问构建的实例。

示例:

UIViewController *controller = [assembly legacyVCB];
//Now push it into a container VC or subview

Typhoon sample application显示了很多这方面的例子。