使用故事板时如何使用 Typhoon 导航到导航控制器中的控制器
How to navigate to a controller in a navigation controller using Typhoon when using storyboards
我在使用 Typhoon 时遇到了这个问题,但首先要了解一些背景知识。
- 我正在使用故事板。
- 故事板从主屏幕开始,然后流向登录,然后到主屏幕 (UITabBarController)。我使用导航控制器作为根控制器。
- 如果用户已经登录,我想显示主屏幕而不显示主页或登录屏幕。这可以在主屏幕中完成
viewDidLoad
(欢迎其他建议)。
我尝试过的几件事是:
使用从主页到 tabController 的 segue,但可以看到主屏幕并且过渡是动画的(不想要这个)。
从情节提要中实例化选项卡控制器(如下所示),但未注入依赖项。我理解这是因为没有使用台风故事板。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"MyAuth"];
我也尝试过使用带有 Typhoon 的工厂作为故事板。
public dynamic func storyboard() -> AnyObject {
return TyphoonDefinition.withClass(TyphoonStoryboard.self){
(definition) in
definition.useInitializer("storyboardWithName:factory:bundle:"){
(initializer) in
initializer.injectParameterWith("Main")
initializer.injectParameterWith(self)
initializer.injectParameterWith( NSBundle.mainBundle() )
}
definition.scope = TyphoonScope.Singleton; //Let's make this a singleton
}
}
///Injection for tabbar controller
public dynamic func tabBarViewController() -> AnyObject {
return TyphoonDefinition.withClass(TabBarViewController.self){
(definition) in
}
}
在 viewDidLoad
上,我将 tabBarViewController(使用注入的程序集)推送到导航控制器,但它没有故事板上指定的选项卡。
func viewDidLoad() {
super.viewDidLoad()
if(userLoggedIn){
self.navigationController?.pushViewController(self.injectedAssembly.storyboard().tabBarController(), animated: false)
}
}
谢谢,
ad 1. 您可以通过在故事板编辑器中选择 segue、切换到 segue 的属性检查器并禁用 "Animates" 复选框来禁用在故事板中创建的 segue 上的动画。
ad 2. 如果包含您发布的代码的 UIViewController 是在 Typhoon 注入的 UIViewController 中实例化的(例如,如果您在家中 viewcontroller 中有此代码,则使用 plist integration,并且home viewcontroller 设置为故事板中的初始 viewcontroller),然后您可以在 UIViewController 中访问 self.storyboard。这个故事板将是 TyphoonStoryboard,因此它会起作用。
ad 3. 仅仅因为您向 Typhoon 提供了有关如何创建 MainStoryboard 和 TabBarViewController 的说明,并不意味着 Typhoon 知道它应该将两者结合起来。尝试使用 TyphoonDefinition
提供的 withFactory:
方法之一来实例化您的 UIViewController 使用正确的故事板(抱歉使用 Obj-C 而不是 Swift)
- (MYViewController *)myViewController {
return [TyphoonDefinition
withFactory:[self storyboard]
selector:@selector(instantiateViewControllerWithIdentifier:)
parameters:^(TyphoonMethod *factoryMethod) {
[factoryMethod injectParameterWith:@"MYViewControllerIdentifier"];
}
configuration:^(TyphoonFactoryDefinition *definition) {
definition.classOrProtocolForAutoInjection = [MYViewController class];
}];
}
我在使用 Typhoon 时遇到了这个问题,但首先要了解一些背景知识。
- 我正在使用故事板。
- 故事板从主屏幕开始,然后流向登录,然后到主屏幕 (UITabBarController)。我使用导航控制器作为根控制器。
- 如果用户已经登录,我想显示主屏幕而不显示主页或登录屏幕。这可以在主屏幕中完成
viewDidLoad
(欢迎其他建议)。
我尝试过的几件事是:
使用从主页到 tabController 的 segue,但可以看到主屏幕并且过渡是动画的(不想要这个)。
从情节提要中实例化选项卡控制器(如下所示),但未注入依赖项。我理解这是因为没有使用台风故事板。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"MyAuth"];
我也尝试过使用带有 Typhoon 的工厂作为故事板。
public dynamic func storyboard() -> AnyObject { return TyphoonDefinition.withClass(TyphoonStoryboard.self){ (definition) in definition.useInitializer("storyboardWithName:factory:bundle:"){ (initializer) in initializer.injectParameterWith("Main") initializer.injectParameterWith(self) initializer.injectParameterWith( NSBundle.mainBundle() ) } definition.scope = TyphoonScope.Singleton; //Let's make this a singleton } } ///Injection for tabbar controller public dynamic func tabBarViewController() -> AnyObject { return TyphoonDefinition.withClass(TabBarViewController.self){ (definition) in } }
在 viewDidLoad
上,我将 tabBarViewController(使用注入的程序集)推送到导航控制器,但它没有故事板上指定的选项卡。
func viewDidLoad() {
super.viewDidLoad()
if(userLoggedIn){
self.navigationController?.pushViewController(self.injectedAssembly.storyboard().tabBarController(), animated: false)
}
}
谢谢,
ad 1. 您可以通过在故事板编辑器中选择 segue、切换到 segue 的属性检查器并禁用 "Animates" 复选框来禁用在故事板中创建的 segue 上的动画。
ad 2. 如果包含您发布的代码的 UIViewController 是在 Typhoon 注入的 UIViewController 中实例化的(例如,如果您在家中 viewcontroller 中有此代码,则使用 plist integration,并且home viewcontroller 设置为故事板中的初始 viewcontroller),然后您可以在 UIViewController 中访问 self.storyboard。这个故事板将是 TyphoonStoryboard,因此它会起作用。
ad 3. 仅仅因为您向 Typhoon 提供了有关如何创建 MainStoryboard 和 TabBarViewController 的说明,并不意味着 Typhoon 知道它应该将两者结合起来。尝试使用 TyphoonDefinition
提供的 withFactory:
方法之一来实例化您的 UIViewController 使用正确的故事板(抱歉使用 Obj-C 而不是 Swift)
- (MYViewController *)myViewController {
return [TyphoonDefinition
withFactory:[self storyboard]
selector:@selector(instantiateViewControllerWithIdentifier:)
parameters:^(TyphoonMethod *factoryMethod) {
[factoryMethod injectParameterWith:@"MYViewControllerIdentifier"];
}
configuration:^(TyphoonFactoryDefinition *definition) {
definition.classOrProtocolForAutoInjection = [MYViewController class];
}];
}