2017-07-05 61 views
0

所以我有3個視圖控制器:TableViewController,A和B.用戶能夠從任何視圖控制器導航到任何視圖控制器。popToViewController沒有彈出所有的視圖控制器

當用戶在A和B視圖控制器之間來回切換時,我希望它們被推到導航欄上。疊加。當按下「home」按鈕時,我希望視圖控制器全部使用popToViewController彈出回到TableViewController,而不是popToRootViewController(出於某種原因)。

我有部分工作代碼,彈出最後訪問的視圖控制器,但現在所有的人之間。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    if indexPath.row == 0 { 
     if let navController = self.navigationController { 
      for controller in navController.viewControllers { 
       if controller is TableViewController { 
        navController.popToViewController(controller, animated: true) 
        break 
       } 
      } 
     } 
    } else { 

     let vcName = identities[indexPath.row] 
     let viewController = storyboard?.instantiateViewController(withIdentifier: vcName) 
     self.navigationController?.pushViewController(viewController!, animated: true) 
    } 

} 

我不知道爲什麼所有的視圖控制器沒有被彈出。我用它來檢查什麼正在入棧和出棧

代碼:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(true) 

    if self.isMovingToParentViewController { 
     print("A is pushed") 
    } 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(true) 

    if self.isMovingFromParentViewController { 
     print("A is popped") 
    } 
} 

我也檢查內存增加。

我會在需要時提供更多的代碼/信息。

任何幫助將不勝感激。

+0

嘗試在調用popToViewController後添加一個「break」。你不想繼續尋找你找到第一場比賽。 – rmaddy

+0

如果for循環背後的想法是在循環內按順序彈出每個控制器,那麼必須等到動畫完成並彈出視圖控制器才能彈出下一個控制器。 – FryAnEgg

+0

@rmaddy會'繼續'最好的工作嗎? –

回答

1

您的困惑可能僅僅是您嘗試「檢查」VC已「彈出」的方式。

假設你已經走了:

root->TableView->A->B->A->B->B->B->` 

在這一點上,唯一的VC是可見的是A最後一個實例。所以,當你調用

navController.popToViewController(controller, animated: true) 

viewWillDisappear()上的A最後一個實例調用 - 沒有任何其他VC情況下,將「消失」,因爲它們不是可見

如果要確認在堆棧中的其他風投被「刪除」,把這個在每個視圖控制器:

deinit() { 
    print("I'm being removed:", self) 
} 

問題的另一部分 - 你通過要動畫過程?所以你真的會看到風險投資公司「走回籌碼」?如果是這樣,請按照@ FryAnEgg的鏈接Completion block for popViewController

+0

好的,謝謝。我會執行你的檢查方式。 –

+0

因此,我實施了您的支票,並發現每個推送都有一個打印聲明。這意味着它每次推動都會彈出。非常感謝!記憶增加壽命的方式仍然很奇怪。我想這個問題可能在別的地方。 –

+0

你使用儀器來檢查內存嗎?你看到任何泄漏?請記住,iOS會在「幕後」做很多內存管理......可能你只是沒有看到正確的東西,或者你是*,但iOS只是在做它的事情:) – DonMag

0

嘗試這樣:

var theControllerIWantToPopTo = controllerB // or whatever other condition 
if let navController = self.navigationController { 
    for controller in navController.viewControllers { 
     if controller is TableViewController { 
      if controller == theControllerIWantToPopTo { 
       navController.popToViewController(controller, animated: true) 
       break 
      } 
     } 
    } 
} 

記住,popToViewController會彈出所有控制器,直到選定一個在頂部,而不是popViewController這隻會彈出頂部控制器。如果您想每次彈出一個動畫,請參閱:Completion block for popViewController

+0

它給我一個錯誤,說'如果控制器== theControllerIWantToPopTo'的行。錯誤顯示'Binary operator'=='不能應用於操作數... –

+0

在我提供的原始代碼中,TableViewController是我想要回彈的視圖控制器。 var'theControllerIWantToPopTo'好像可能是多餘的。 –

+0

'TableViewController'是一個實例還是一個類?但是,您可以找到想要彈出的一個控制器實例,調用popTo,它將彈出所有內容。我認爲只會顯示一個動畫,即使它彈出多個控制器。 – FryAnEgg

相關問題