我有一些控制器,并使用Typhoon将对象作为属性注入这些控制器。我使用了Plist集成。我发现有时候对象没有按预期注入到视图控制器中。
例如,MainTabBarController是初始视图控制器,SplashViewController是其他一些视图控制器。我已将对象注入代码中的属性。验证对象是否被注入MainTabBarController。
在某些时候,我需要从MainTabBarController呈现SplashViewController,如下所示:
SplashViewController *vc = [[UIStoryboard storyboardWithName:@"Main"
bundle:[NSBundle mainBundle]]
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
当我尝试在SplashViewController中访问该对象时,它失败了。该属性不包含该对象。
经过一番调查后,我发现我通过调用[UIStoryboard storyboardWithName:@" Main" bundle:[NSBundle mainBundle]]不是TyphoonStoryboard,但MainTabBarController的是TyphoonStoryboard。因此我改为:
SplashViewController *vc = [self.storyboard
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
然后SplashViewController包含注入的对象。我想确认这种行为是否是预期的,这是处理这类问题的正确方法。
非常感谢!
答案 0 :(得分:1)
是的,这是预期的行为。如果您使用plist集成:
UILaunchStoryboardName
的故事板(如果有的话)将是TyphoonStoryboard的一个实例,它就像一个普通的故事板,其附加好处是根据在plist中定义的程序集。 TyphoonStoryBoard
的实例才能进行依赖注入。 如果您想在程序集中定义该故事板,可以执行以下操作:
- (UIStoryboard *)storyboard
{
return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(storyboardWithName:factory:bundle:)
parameters:^(TyphoonMethod *initializer) {
[initializer injectParameterWith:@"StoryboardName"];
[initializer injectParameterWith:self];
[initializer injectParameterWith:[NSBundle mainBundle]];
}];
}];
}
并将此故事板提供给任何组件需要它。