台风从情节提要中将 属性 注入视图控制器
Typhoon injecting property into view controller from storyboard
我有几个控制器并使用 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"得到的storyboard
bundle:[NSBundle mainBundle]] 不是 TyphoonStoryboard,但是 MainTabBarController 的那个是 TyphoonStoryboard。因此,我将其更改为:
SplashViewController *vc = [self.storyboard
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
然后 SplashViewController 包含注入的对象。我想确认这种行为是否符合预期,这是处理此类问题的正确方法。
非常感谢!
是的,这是预期的行为。如果您使用 plist 集成:
- 在您的应用程序的 plist 中定义为
UILaunchStoryboardName
的故事板(如果有)将是 TyphoonStoryboard 的一个实例,它就像一个普通的故事板一样工作,并且有一个额外的好处,即根据定义的程序集注入依赖项在你的列表中。
- 以编程方式创建额外的情节提要,如某些人所做的那样,例如,将情节提要分成用例,需要
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]];
}];
}];
}
并将这个故事板提供给任何需要它的组件。
我有几个控制器并使用 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"得到的storyboard bundle:[NSBundle mainBundle]] 不是 TyphoonStoryboard,但是 MainTabBarController 的那个是 TyphoonStoryboard。因此,我将其更改为:
SplashViewController *vc = [self.storyboard
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
然后 SplashViewController 包含注入的对象。我想确认这种行为是否符合预期,这是处理此类问题的正确方法。
非常感谢!
是的,这是预期的行为。如果您使用 plist 集成:
- 在您的应用程序的 plist 中定义为
UILaunchStoryboardName
的故事板(如果有)将是 TyphoonStoryboard 的一个实例,它就像一个普通的故事板一样工作,并且有一个额外的好处,即根据定义的程序集注入依赖项在你的列表中。 - 以编程方式创建额外的情节提要,如某些人所做的那样,例如,将情节提要分成用例,需要
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]];
}];
}];
}
并将这个故事板提供给任何需要它的组件。