Objective c Tabbar控制器前的Loginview
立即在我的appdelegate中将LoginViewController呈现在我的tabbarcontroller之前 我尝试使用此代码块,并将navagation控制器标识命名为“log” 警告:尝试显示其视图不在窗口层次结构中的对象Objective c Tabbar控制器前的Loginview,objective-c,ios7,Objective C,Ios7,立即在我的appdelegate中将LoginViewController呈现在我的tabbarcontroller之前 我尝试使用此代码块,并将navagation控制器标识命名为“log” 警告:尝试显示其视图不在窗口层次结构中的对象 请提供任何意见。当您在appDelegate中时,您必须使用self.window.rootViewController: UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main"
请提供任何意见。当您在
appDelegate
中时,您必须使用self.window.rootViewController
:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
LoginViewController *logincontroller= [storyboard instantiateViewControllerWithIdentifier:@"log"];
[self.window.rootViewController presentViewController:logincontroller animated:NO completion:nil];
我想您没有看到我想要指出的,您正在使用UINavigationController
,但是UINavigationController
类实现了一个专门的视图控制器,用于管理分层内容的导航。您正试图以模式显示登录视图,因此它不是导航堆栈的一部分
您应该查找LoginView控制器,并使用其情节提要Id创建一个新的实例。您是否试图在ApplicationIDFinishLaunching:中显示LoginView控制器?此时,根视图控制器还没有出现,因此它还不在窗口层次结构中。你可以做三件事。第一,将其显示在ApplicationIDBecomeActive中:
- (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];
}
或者,您可以使其从选项卡栏控制器的ViewDidDisplay中显示。这假定您有一个自定义选项卡栏控制器
在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];
}
这两种解决方案都将首先显示根视图控制器,然后以模式推送日志视图控制器。如果要立即显示,请将“动画:是”更改为“动画:否”
另一种方法是让您的登录名成为根视图控制器。如果用户尚未登录,则不应使用tabbar控制器,因为这样它可能会尝试加载不可用的内容。如果是这样的话,您应该从故事板中的单个登录控制器开始。如果登录成功,您可以将选项卡栏放在登录的顶部(而不是将登录放在选项卡栏的顶部),或者用登录控制器替换rootviewcontroller
编辑1:
当您在另一个模式视图控制器上显示一个模式视图控制器时,为了使新控制器具有导航控制器,您必须同时显示一个导航控制器。这是你应该拥有的故事板。第一个视图是选项卡控制器。当您确定用户需要登录时,请预设UINavigationController,其rootViewController是您的loginController
编辑2:
我调整了我的故事板,这样登录控制器就不会被导航栏覆盖。您必须取消设置扩展边:在右窗格的顶部栏下。此外,您还可以将后退/关闭按钮直接添加到故事板中的导航栏上
编辑3:
请注意,应用程序IDBECOMEACTIVE:中应显示的控制器是导航控制器。我展示的示例登录控制器不起任何作用,您应该向按钮等添加其他功能。当您实例化并显示导航控制器时,它将显示它拥有的任何rootViewController(在本例中,是您的登录控制器)与导航栏一起使用。第一个解决方案起作用,但它没有显示我的导航栏控制器EA,原因是导航控制器属于登录控制器,登录完成后,你的新堆栈中没有导航控制器。很抱歉,当我按Login时,我不太明白你在说什么@mintrenegadeso我应该用哪行代码来显示TABBARCONTROLLER@mintrenegade@m34我更新了代码。在编辑3中,我指定您应该实例化导航控制器而不是登录控制器。因此,请向导航控制器添加情节提要id,不要使用“日志”情节提要id。
-(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];
}