2017-06-07 38 views
0

概述:iOS的最佳實踐 - 定製回動作,popToViewController:VS手動刪除從導航堆棧控制器

我已經3個控制器A,B & C和推視圖控制器所示在下面的圖片。

Navigation stack

方案

我總是想視圖控制器彈到 'A' 不管是什麼。假設下面的流程。

NC > A > B > C 

有兩種方法可以處理返回操作。

popToViewController: -彈出到特定視圖控制器,在本例中爲'A'。

從導航堆棧中移除視圖控制器'B'。以這種方式,視圖控制器'C'總是彈出來查看控制器'A'。

問:

  1. 由於iOS的後退按鈕(navigationBar.backButtonItem)沒有任何作用,除了流行音樂定製,我們要添加自定義左側欄按鈕,返回按鈕,並添加手動處理popViewController的按鈕動作。

  2. 在其他情況下,如果我們從導航堆棧中移除視圖控制器B並保留默認的導航欄後退按鈕。當點擊後退按鈕時,它會彈出來查看控制器'A'。

哪一個是最好的選擇,並簡單介紹爲什麼它更好?

注意

視圖控制器「A」不是根視圖控制器,而不是尋找代碼解決方案。

謝謝。

回答

0

最好的辦法是使用popToViewController:animated API調用來彈出所需的viewController,您可以使用

if let viewControllerA = self.navigationController?.viewControllers[1] as? ViewControllerA { //replace index 
    self.navigationController?.popToViewController(viewController, animated: true) 
} 

回去「的ViewController-A」從「視圖控制器-C」使用自定義leftbarButton和添加行爲到它。

從VC-B,你可以去正常使用

self.navigationController?.popViewController(animated: true)

編輯:

•popToViewController: - 彈出特定的視圖控制器:這將是更好的辦法,因爲它使用UINavigationController API,無需從導航堆棧中刪除任何視圖控制器的開銷,這將使讀取代碼時更加清晰,如果需要某些用例,則會返回VC-B的額外優勢將來會展示VC-B,以便您可以輕鬆地將其插入到leftBarbuttonItem的backAction中或從VC-C中的任何位置的代碼中調用它。

+0

感謝您的回覆。我編輯了我的問題,'A'不是根視圖控制器。但問題是哪個更好的選項彈出特定的vc或從堆棧中刪除vc。另外我需要說明爲什麼這個選項比其他更好。 – Tesan3089

+0

編輯我的答案,從導航層次結構中刪除viewcontroller是很少的開銷,因爲API是可用的,你可以使用它。 – suhit

+0

同意,但我仍然在尋找解決viewcontroller是不好的做法的答案。 – Tesan3089