2013-06-21 29 views
6

我使用UINavigationController的處理控制器導航的UINavigationController popToViewController問題

正常情況下

RegistrationView - > LoginView - > HomeView

從HomeView &任何其他未來的控制器有打開一個名爲設置的屏幕,該屏幕具有註銷按鈕。在正常情況下,點擊此按鈕屏幕將彈出到LoginView。如果用戶曾經,這裏的應用程序具有自動登錄功能登錄

- (IBAction)btnLogoutSelected:(id)sender 
{ 
    NSArray *navArr=self.navigationController.viewControllers; 
    for (UIViewController *nav in navArr) 
    { 
     if ([nav isKindOfClass:[LoginViewController class]]) 
     { 
      [self.navigationController popToViewController:nav animated:YES]; 
     } 
    } 
} 

一旦用戶將被註冊&。所以在那個時候LoginView將不在導航計數中。所以在這種情況下上面的代碼不起作用。所以當時我無法去登錄視圖。我需要幫助來解決這個問題。在此先感謝

回答

8

如果你沒有對導航堆棧LoginViewController一個實例,簡單地創建它:

LoginViewController* loginController = [[LoginViewController alloc] init]; //use appropriate initWith... method 

然後你可以使用的UINavigationController的viewControllers財產。你可以用loginController替換當前視圖控制器,或者在給定的索引插入loginController和流行吧。

NSMutableArray* newViewControllers = [self.navigationController.viewControllers mutableCopy]; 
[newViewControllers replaceObjectAtIndex:[newViewControllers indexOfObject:self] withObject:loginController]; 
[self.navigationController setViewControllers:newViewControllers animated:YES]; 
+2

我正要張貼了同樣的答案:) +1 約翰:您可以通過複製'RegistrationViewController'並加入新鮮創建'LoginViewController'它上面創建自己的'viewControllers'棧,然後設置動畫的堆棧建議作者Michal –

+0

@ michal-ciuba謝謝,它工作正常,我得到了它的概念。 –

+0

@ bogdan-weidmann謝謝。 –

3

嘗試這個

if ([self.navigationController.viewControllers containsObject:objLogin]) { 
      [self.navigationController popToViewController:objLogin animated:TRUE]; 
     } 
     else { 
      [self.navigationController pushViewController:objLogin animated:TRUE]; 
     } 
+0

你是對的,這可以很好地工作,但在自動登錄情景的時候,LoginView不會被添加到導航,所以它不是在navigationController計數。 –

+2

那時你不得不推或目前登錄的ViewController .. –

+0

你是完全正確的,在那個時候我並沒有太多瞭解關於導航。 –