我有一些控制器,并使用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包含注入的对象。我想确认是否会出现这种现象,这是处理此类问题的正确方法。
非常感谢!
最佳答案
是的,这是预期的行为。如果使用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]];
}];
}];
}
并将此情节提要提供给任何需要的组件。
关于ios - 台风从 Storyboard 向 View Controller 中注入(inject)属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29359605/