2013-05-09 43 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