在我的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];
警告:尝试显示其视图不在窗口层次结构中!
请任何想法。
答案 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:
当您将模态视图控制器置于另一个控制器之上时,为了使新控制器具有导航控制器,您必须同时提供导航控制器。这是你应该拥有的故事板。第一个视图是标签控制器。当您确定用户需要登录时,请预设其rootViewController是您的loginController的UINavigationController。
编辑2:
我调整了故事板,因此登录控制器没有被导航栏覆盖。您必须取消设置扩展边缘:右窗格中的顶部栏。此外,您可以直接在故事板中的导航栏上添加后退/关闭按钮。
编辑3:
请注意,您应该在applicationDidBecomeActive中显示的控制器是导航控制器。我显示的示例登录控制器什么都不做,你应该为按钮等添加其他功能。当你实例化并显示导航控制器时,它将显示它拥有的任何rootViewController(在这种情况下,你的登录控制器)以及导航杆