2012-04-13 50 views
6

我需要去我的應用程序的第一個視圖。我有幾個視圖推入堆棧,然後模態導航控制器和更多的視圖推到那。轉到第一個視圖控制器在應用程序

我遇到的問題是,使用[[self navigationController] popToRootViewControllerAnimated:YES];只追溯到在模態堆棧中的第一個視圖。

而且我不能讓[[self navigationController] popToViewController:..工作,因爲真正的第一個視圖控制器不可訪問[[self navigationController] viewControllers]

有關如何完成此任何想法?謝謝。

+0

哪個navigationController你打電話?它會彈出到名爲I imagine的導航控制器的根目錄。 – 2012-04-13 21:02:04

+0

將第一個視圖控制器作爲navigationController的rootViewcontroller – 2012-04-13 21:09:40

+0

關閉模式視圖控制器,然後彈出到根目錄。 – Till 2012-04-13 21:14:19

回答

6

這樣做:

[[self navigationController] dismissModalViewControllerAnimated:YES]; 

,將讓你回到那個模式地呈現導航控制器的VC。在這之後取得更遠的地方取決於你如何在導航控制器之前推送這些「少量視圖」。

編輯 - 解釋去最深的根......

這聽起來像那些「少數意見」是另一個,導航控制器的堆棧底層。這可能有點棘手,因爲乾淨的方式是讓底層導航控制器彈出它自己的根目錄。但是,它怎麼知道它上面的模態VC已經完成了?

我們稱之爲做第二導航控制器VC_a的模式呈現視圖控制器。它是一個模態表示的導航控制器,其最高層的VC是VC_b。當VC_b模式自行解散時,VC_a如何才能知道彈出到它的導航根目錄?

好答案(通常)是VC_b決定辭退本身是有原因的 - 在你的應用中的一些條件/模式改變,使其決定要做。

我們希望VC_a檢測這個條件了。當VC_b被開除,VC_a得到一個viewWillAppear中的消息,因爲它即將被揭開:

// VC_a.m 

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 
    if (/* some app condition that's true when VC_b is done */) { 
     // I must be appearing because VC_b is done, and I'm being uncovered 
     // That means I'm done, too. So pop... 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
    } else { 
     // I must be appearing for the normal reason, because I was just pushed onto the stack 
    } 
} 
+0

我的問題是解僱模態視圖控制器之前,我有沒有引用將位於堆棧頂部的視圖來將其告知popToRoot。在單一模態視圖之前的所有其他視圖都使用performSegueWithIdentifier進行推送轉換,但它們都不是模態。 – 2012-04-13 21:25:06

+0

但是做了第二個導航控制器模態表示的人知道它是誰。那個人會知道導航控制器在獲取(第二個)視圖時會被解僱。那個人可以自己彈出。請參閱我的編輯。 – danh 2012-04-13 21:44:17

+0

換句話說,被解僱的人不知道應該流行誰,也不應該。提交的人會這樣做。在最後一個視圖 – danh 2012-04-13 21:45:05

0

您需要使用delegation pattern做到這一點。具體來說,通過創建一個實現代理的方法respondsToSelector的協議。

完整的詳細信息,請參閱this post。它應該幾乎完全符合你的要求。我不得不做類似的事情,除了我只需要從導航堆棧中彈出一個視圖而不是使用popToRootViewControllerAnimated:

+0

這看起來好像會起作用,我可以用上述答案中的編輯代碼更快地實現它。謝謝 – 2012-04-13 21:48:30

0

在AppDelegate.m類中創建方法與波紋管流...

-(void)MethodName{//your method name 
    YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController" 
    UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease]; 

    self.window.rootViewController = yourNavigationController; 
} 

當你想重定向的firstView只是調用這個方法從的appdelegate對象....

0

對於iOS6的...

[self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil]; 
相關問題