台风从情节提要将属性注入视图控制器
Posted
技术标签:
【中文标题】台风从情节提要将属性注入视图控制器【英文标题】:Typhoon injecting property into view controller from storyboard 【发布时间】:2015-03-31 02:29:49 【问题描述】:我有几个控制器并使用 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 包含注入的对象。我想确认这种行为是否是预期的,这是处理此类问题的正确方法。
非常感谢!
【问题讨论】:
【参考方案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]];
];
];
并将这个故事板提供给任何需要它的组件。
【讨论】:
NB:抱歉,这在之前的文档中不是很清楚。稍作修正。以上是关于台风从情节提要将属性注入视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
如何从应用程序委托、情节提要、iOS6 获取我的视图控制器的实例