1

我有几个控制器并使用 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]]得到的storyboard不是TyphoonStoryboard,而MainTabBarController的是TyphoonStoryboard。因此,我将其更改为:

SplashViewController *vc = [self.storyboard 
                     instantiateViewControllerWithIdentifier:@"SplashNavigationController"];

[self presentViewController:vc
                   animated:YES
                 completion:nil];

然后 SplashViewController 包含注入的对象。我想确认这种行为是否是预期的,这是处理此类问题的正确方法。

非常感谢!

4

1 回答 1

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]];
            }];
    }];
}

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

于 2015-03-31T03:15:46.743 回答