从故事板向视图控制器注入属性的台风

时间:2015-03-31 02:29:49

标签: ios objective-c dependency-injection typhoon

我有一些控制器,并使用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包含注入的对象。我想确认这种行为是否是预期的,这是处理这类问题的正确方法。

非常感谢!

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为。如果您使用plist集成:

  • 在你的应用程序的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]];
            }];
    }];
}

并将此故事板提供给任何组件需要它。