1

我已经使用故事板和 plist 集成测试了 Typhoon,在我的程序集中定义了依赖项并按预期工作。例如,当从 ViewControllerA 到 ViewControllerB 执行推送 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,因为内存地址不同。你认为为什么会这样?

提前致谢。

4

1 回答 1

0

Typhoon 与 UIStoryboard 挂钩,因此它就像一个常规的故事板一样工作,并具有注入依赖项的额外好处,但由于 Typhoon 是一个依赖项注入容器,获取注入实例的正常方法是通过组装接口询问 Typhoon。

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

例子:

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

Typhoon 示例应用程序显示了很多这样的示例。

于 2015-07-17T23:33:14.970 回答