Ios 在不使用情节提要的情况下向ViewController注入依赖项

Ios 在不使用情节提要的情况下向ViewController注入依赖项,ios,objective-c,typhoon,Ios,Objective C,Typhoon,我已经使用故事板和plist集成测试了typhone,在我的程序集中定义了依赖项,并按预期工作。 对ViewControllerB的依赖关系被正确注入,例如,当从ViewControllerA到ViewControllerB执行推送序列时。我已经看到InstanceEviewController的标识符被Swizzle用来注入属性 然而,我也有不使用故事板的遗留代码。它使用XIBs。 例如,LegacyViewControllerA推动LegacyViewControllerB: 这是Legac

我已经使用故事板和plist集成测试了typhone,在我的程序集中定义了依赖项,并按预期工作。 对ViewControllerB的依赖关系被正确注入,例如,当从ViewControllerA到ViewControllerB执行推送序列时。我已经看到InstanceEviewController的标识符被Swizzle用来注入属性

然而,我也有不使用故事板的遗留代码。它使用XIBs。 例如,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时,我希望已经注入ApicClient依赖项,但事实并非如此。为什么?

编辑:

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

所以,假设我没有任何故事板,那么注入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。 你认为这是为什么


提前感谢。

Typhone挂接到UIStoryboard,这样它就像一个常规故事板一样工作,具有注入依赖项的额外好处,但由于Typhone是一个依赖项注入容器,获得注入实例的正常方法是通过汇编接口询问Typhone

  • 将程序集注入要显示非故事板控制器的故事板视图控制器
  • 向程序集请求生成的实例
例如:

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

图中给出了很多这样的例子

Typhone钩住UIStoryboard,使其与常规故事板一样工作,并增加了注入依赖项的好处,但由于Typhone是一个依赖项注入容器,获取注入实例的正常方法是通过汇编接口询问Typhone

  • 将程序集注入要显示非故事板控制器的故事板视图控制器
  • 向程序集请求生成的实例
例如:

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

图中给出了很多这样的例子

是的,很简单。我在这里为您单独回答了一个问题:不过,如果我在
[self.navigationController-pushViewController:legacyVCB-animated:YES]之后调试LegacyViewControllerB的viewDidLoad,那就谢谢了我看到它没有注入依赖项(apiClient)。似乎推动创造了一个新的LegacyViewControllerB。你认为为什么会发生这种情况?如果这有助于理解我的问题,我可以在Github中与你分享一个使用故事板(按预期工作)而不使用故事板(未按预期注入)的示例项目。在一个新问题中发布了问题:是的,非常简单。我在这里为您单独回答了一个问题:不过,如果我在
[self.navigationController-pushViewController:legacyVCB-animated:YES]之后调试LegacyViewControllerB的viewDidLoad,那就谢谢了我看到它没有注入依赖项(apiClient)。似乎推动创造了一个新的LegacyViewControllerB。你认为为什么会发生这种情况?如果这有助于理解我的问题,我可以在Github中与你分享一个使用故事板(按预期工作)和不使用故事板(未按预期注入)的示例项目。在新问题中发布了问题: