2013-05-09 52 views
1

我有一个以LoginViewController作为初始视图的应用程序。在使用Storyboard时澄清prepareforsegue和presentModalViewController

注意:所以在appDelegate.m中,self.window.rootViewController不是TabBarController。 enter image description here

Auth后,我介绍了应用程序的主要部分,它有一个带有两个选项卡的tabbarController(标识符: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]; 

它的工作原理很好的视觉。现在我需要通过MOC。阅读关于PrepareToSegue方法,创建从loginVC一个SEGUE(模态,在PIC中未示出)到我TargetViewController(的TabBar> NavigationController1>视图1),命名为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控制器?

我一直在试图获得模态选项卡的参考,但仍然不清楚。有人可以用一般的术语解释如何处理这种情况?

+0

你说你目前的标签栏控制器,所以在这之后,屏幕上的看法应该是一个我认为你在调用目标视图控制器(TabBar> NavigationController1> View1)。所以,如果这是真的,那么为什么你想从登录控制器继续到屏幕上已有的? – rdelmar 2013-05-10 00:19:40

+0

@rdelmar屏幕上的初始视图是loginScreen。我(想)仅在用户登录后才呈现tabbarController> NavigationController> View1。这就是为什么我尝试从登录屏幕查看segue到view1的原因。 – aVC 2013-05-10 01:17:13

回答

0

我认为使用不使用模式转换到标签栏控制器的设计会更好。模态演示文稿通常应该是为了中断正常的应用程序流程,而不是让您的主控制器在屏幕上。有两种选择,我认为更好。您可以将登录控制器作为窗口的初始根视图控制器,但将它切换为标签栏控制器(这将成为窗口的新的根视图控制器,并且登录控制器将被解除分配)。这通常工作正常,但我认为在这种情况下,你想从应用程序委托(我假设)将MOC传递给标签栏控制器中的控制器,我认为第二种方法会更好。

第二种方法来做到这一点,以及我通常做登录控制器的方式是让标签栏控制器成为窗口的根视图控制器,然后从初始的viewDidAppear方法模态地呈现登录控制器视图(这将是你打电话给View1的人)。如果你这样做演示动画设置为NO,登录控制器将是用户看到的第一件事:

-(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; 
+0

感谢您的评论。我明白你的意思。我试了一下,发现它的工作。但是要知道,如果tabbar是以模态方式呈现的,是否可以告诉我如何进入tabbarcontroller> navController> View1?更好地了解后,我感到很轻松。 :) – aVC 2013-05-10 14:43:27

+0

如果您从登录控制器执行该演示文稿,则问题中的前3行应在屏幕上显示带View1的标签栏。或者,您可以用segue来完成,但是您需要将登录控制器的segue连接到标签栏控制器,而不是导航控制器。 – rdelmar 2013-05-10 15:13:31