我使用故事板和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,因为内存地址不同。
为什么你认为这种情况正在发生?
提前致谢。
答案 0 :(得分:0)
Typhoon挂钩进入UIStoryboard,以便它像常规故事板一样工作,并且注入了依赖关系,但由于Typhoon是依赖注入容器,获取注入实例的正常方法是通过装配界面询问台风。
示例:
UIViewController *controller = [assembly legacyVCB];
//Now push it into a container VC or subview
Typhoon sample application显示了很多这方面的例子。