在TabBarController之前的Loginview

时间:2014-09-05 03:33:04

标签: objective-c ios7

在我的tabbarcontroller

之前立即在我的appdelegate中显示LoginViewController
  

我尝试使用此代码块,并将导航控制器标识命名为" log"

 UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *logincontroller=[storyboard instantiateViewControllerWithIdentifier:@"log"];
[tabBarController presentViewController:logincontroller animated:YES completion:NULL];
  

警告:尝试显示其视图不在窗口层次结构中!

请任何想法。

2 个答案:

答案 0 :(得分:0)

您在self.window.rootViewController时必须使用appDelegate

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
LoginViewController *logincontroller= [storyboard instantiateViewControllerWithIdentifier:@"log"];
[self.window.rootViewController presentViewController:logincontroller animated:NO completion:nil];

我不认为你看到我想指出的是什么,你正在使用UINavigationController,但 UINavigationController 类实现了一个专门的视图控制器来管理导航等级内容。您试图以模态方式显示登录视图,因此它不是导航堆栈的一部分。

您应该寻找 LoginViewController 并使用其故事板ID创建新的实例。

答案 1 :(得分:0)

您是否尝试在applicationDidFinishLaunching中呈现LoginViewcontroller:?此时,根视图控制器尚未出现,因此它尚未出现在窗口层次结构中。你可以做三件事。一,让它出现在applicationDidBecomeActive:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UINavigationController *controller = [storyboard instantiateViewControllerWithIdentifier:@"navigationForLog"];
    [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
}

或者,您可以从标签栏控制器的viewDidAppear中显示它。假设您有一个自定义标签栏控制器。

在MyCustomTabBarController.m中:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
   UINavigationController *controller = [storyboard instantiateViewControllerWithIdentifier:@"navigationForLog"];
    [self presentViewController:controller animated:YES completion:nil];
}

这两个解决方案都将首先显示根视图控制器,然后以模态方式推送日志视图控制器。如果您希望立即显示,请将动画:YES更改为动画:否。

另一种方法是让您的登录名为根视图控制器。如果您的用户尚未登录,则您不应该使用标签栏控制器,因为它可能会尝试加载不可用的内容。如果是这种情况,您应该从故事板中的单个登录控制器开始。如果登录成功,您可以将标签栏放在登录页面的顶部(而不是标签栏顶部的登录名),也可以将rootviewcontroller替换为登录控制器。

编辑1:

当您将模态视图控制器置于另一个控制器之上时,为了使新控制器具有导航控制器,您必须同时提供导航控制器。这是你应该拥有的故事板。第一个视图是标签控制器。当您确定用户需要登录时,请预设其roo​​tViewController是您的loginController的UINavigationController。

enter image description here

编辑2:

我调整了故事板,因此登录控制器没有被导航栏覆盖。您必须取消设置扩展边缘:右窗格中的顶部栏。此外,您可以直接在故事板中的导航栏上添加后退/关闭按钮。

enter image description here

编辑3:

请注意,您应该在applicationDidBecomeActive中显示的控制器是导航控制器。我显示的示例登录控制器什么都不做,你应该为按钮等添加其他功能。当你实例化并显示导航控制器时,它将显示它拥有的任何rootViewController(在这种情况下,你的登录控制器)以及导航杆