我已经使用故事板和 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,因为内存地址不同。你认为为什么会这样?
提前致谢。