Ios 在使用故事板时澄清prepareforsegue和presentModalViewController

Ios 在使用故事板时澄清prepareforsegue和presentModalViewController,ios,uitabbarcontroller,modalviewcontroller,Ios,Uitabbarcontroller,Modalviewcontroller,我有一个以LoginViewController作为初始视图的应用程序 注意:因此在appDelegate.m中,self.window.rootViewController不是TabBarController。 在Auth之后,我展示了应用程序的主要部分,它有一个tabBar控制器标识符:tabBar有两个选项卡,一个选项卡有一个导航控制器。我正在使用核心数据,所以我需要通过MOC 如果我使用 UIStoryboard *storyboard = [UIStoryboard storyboa

我有一个以LoginViewController作为初始视图的应用程序

注意:因此在appDelegate.m中,self.window.rootViewController不是TabBarController。

在Auth之后,我展示了应用程序的主要部分,它有一个tabBar控制器标识符:tabBar有两个选项卡,一个选项卡有一个导航控制器。我正在使用核心数据,所以我需要通过MOC

如果我使用

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *obj=[storyboard instantiateViewControllerWithIdentifier:@"tabBar"];
[obj setSelectedIndex:0];// Which tab to show first
[self presentModalViewController:obj animated:YES];
它的视觉效果很好。现在我需要通过商务部。阅读有关PrepareToSegue方法的内容,创建了一个segue模式,未显示在从loginVC到my TargetViewController TabBar>NavigationController1>View1的pic中,命名为segue LoginSegue并使用以下代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
View1 *devicelist = (View1 *)[[navController viewControllers] lastObject];
devicelist.managedObjectContext = managedObjectContext;
}
选项卡栏不显示。在这种情况下,如何设置tabbar控制器


我一直在尝试获取模态Tabbar的参考,但仍然不清楚。有人能用外行术语解释一下如何处理这样的情况吗?

我认为最好使用一种设计,不使用到选项卡栏控制器的模式转换。模式演示通常被认为是为了中断应用程序的正常流程,而不是为了让主控制器出现在屏幕上。有两种选择,我认为更好。您可以将登录控制器保留为窗口的初始根视图控制器,但随后将其切换为选项卡栏控制器,该选项卡栏控制器将成为窗口的新根视图控制器,登录控制器将被解除分配。这通常可以正常工作,但我认为在这种情况下,如果您希望将MOC从应用程序委托传递到选项卡栏控制器中的控制器,我认为第二种方法会更好

第二种方法,也是我通常使用的登录控制器,是让选项卡栏控制器成为窗口的根视图控制器,然后从初始视图的ViewDidDisplay方法(您正在调用View1)以模态方式显示登录控制器。如果在动画设置为“否”的情况下执行此演示,则登录控制器将是用户看到的第一件事:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    static int first = 1;
    if (first) {
        LoginViewController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
        [self presentViewController:login animated:NO completion:nil];
        first = 0;
    }
}
if语句在其中,因此当您从登录控制器返回时,演示不会再次发生。您可以执行更复杂的操作,例如从登录控制器向View1发出委托调用,指示登录成功(如果您愿意),但这是可行的

如果登录成功,您只需关闭登录控制器,如果登录失败,您将出现在第一个视图中,您永远不会关闭它,并且可能会显示一条消息说登录失败

如果您走这条路线,那么您可以在应用程序代理中通过MOC,如下所示:

UINavigationController *nav = [(UITabBarController *)self.window.rootViewController viewControllers][0];
View1 *devicelist = (View1 *)nav.viewControllers.lastObject;
devicelist.managedObjectContext = managedObjectContext;

您说您显示了选项卡栏控制器,因此在此之后,屏幕上的视图应该是我认为您正在调用的目标视图控制器TabBar>NavigationController1>View1。那么,如果这是真的,那么为什么要从登录控制器切换到屏幕上已有的控制器?@rdelmar屏幕上的初始视图是loginScreen。我只想在用户登录后显示选项卡BarController>NavigationController>View1。这就是为什么我尝试了从登录屏幕到视图1的顺序。谢谢你的评论。我明白你的意思。我试过了,效果很好。但是,我想知道,如果tabbar是以模式显示的,是否可以告诉我如何访问tabbar controller>navController>View1?在对它有了更深入的了解之后,我可以轻松地切换路径如果您从登录控制器进行演示,问题的前3行应该显示屏幕上带有View1的选项卡栏。或者,您可以使用segue来完成,但是您需要将segue从登录控制器连接到选项卡栏控制器,而不是导航控制器。