Objective c Tabbar控制器前的Loginview

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中将LoginViewController呈现在我的tabbarcontroller之前

我尝试使用此代码块,并将navagation控制器标识命名为“log”

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


请提供任何意见。

当您在
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];
}