2016-08-15 32 views
0

我有幾個視圖控制器,稱它們爲1,2,3,4,5和6.我做了UINavigationController,它有一個後退按鈕。後退按鈕出現在每個視圖控制器上(我永遠不會隱藏它)。指定每個視圖控制器的後退按鈕的行爲

現在我有這樣的情況。我從1,2,3,4,5然後回到3.就像一個額外的信息,從5到3的轉換是通過手動轉換完成的(但有時候我使用其他的轉換,如push或modal)。如果我點擊該視圖控制器上的後退按鈕,通常它會到5,因爲堆疊的工作原理。但我想能夠指定,從視圖控制器3,你總是去點擊後退按鈕時的VC 2 ...

我想在這裏操縱導航堆棧可能是一種方式(基於當前視圖控制器),但我不知道是理想的,還是有一些更合適的...

回答

2

你可以繼承和覆蓋某些方法UINavigationController得到一個回調按下後退按鈕時。然後,您可以強制導航控制器響應您的要求。

例如,當調用popViewController(animated:)時,可以根據視圖控制器(或者您想要的)來確定是否應該實際允許正常的後退按鈕功能。如果您想要正常行爲,請致電super。在從視圖控制器3到視圖控制器2(而不是視圖控制器5)的情況下,您不會撥打super,而是撥打popToViewController(viewController2, animated: animated)

+0

我最終這樣做了......嘗試了其他一些方法,但這是最簡單和最乾淨的實現。至少對於我來說。 – Whirlwind

+0

我剛剛在控制檯中發現了一條警告,它說:*完成處於意外狀態的導航轉換。導航欄子視圖樹可能會被損壞。*如果我做popToViewController(vc2,animated:animated),就會發生這種情況。如果我將動畫設置爲false,則消息消失,但後退按鈕也會消失。我想這是一種競爭條件。任何想法如何擺脫這個消息,而不失去一個後退按鈕? – Whirlwind

1

用你自己的自定義按鈕替換後退按鈕,你可以設置動作執行回到3。或者你可以使用導航控制器的兒童堆棧返回到3,這是你更喜歡的。

在視圖控制器

添加以下代碼:

let backButton: UIBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(viewController.navigationController?.popViewController(animated:))) 

    viewController.navigationItem.setLeftBarButton(backButton, animated: true) 

目前該行動將使用默認的行爲,並彈回一個。然而,你可以用自己的方式改變這一點,執行SEGUE回3

+0

我剛剛刪除了我的評論,因爲它是無關緊要的。我誤解了* segue *的含義,所以我現在就明白你的意思。 – Whirlwind

0

讓我們考慮你已經打開了VC的1,2,3,4,5 比你打開VC 3. 所以,你有這樣的UINavigationControllercontrollers堆[1,2,3,4,5,3]

如果要具有迴轉型UIViewController#3可以只刪除控制器#3,#4和#5(從導航的中間堆棧)在轉換完成#3時。

func viewDidLoad() { 
     self.navigationController.delegate = self 
} 

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 

    NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers]; 
//Navigation stack now is [1, 2, 3, 4, 5, 3]. removing VC#3 
     [allViewControllers removeObjectAtIndex: 2]; 

//Navigation stack now is [1, 2, 4, 5, 3]. removing VC#4 
     [allViewControllers removeObjectAtIndex: 2]; 

//Navigation stack now is [1, 2, 5, 3].removing VC#5 
     [allViewControllers removeObjectAtIndex: 2]; 

//Navigation stack now is [1, 2, 3] 
navigationController.viewControllers = allViewControllers; 

} 

去除雖視圖控制器從導航堆棧,你會回來的過渡,從3比2

2

通常,當我想「跳回」多個視圖時,我使用了「委派」。你真正想要做的是從堆疊中彈出幾個不只是繼續你想去的地方。

我會推薦的是每個獲得通過的VC上的委託方法。即VC 1可以關閉VC 2,VC 2可以關閉VC 3等。然後,當你在VC 5上時,你可以調用navigateToView(index:Int)來做一個快速檢查,如果他們查看控制器,那個響應那個委託調用的控制器匹配那個索引那麼你只需彈出之前顯示的VC,你就很好。如果沒有,則彈出先前顯示的VC,然後調用該VC委託方法,直到您到達想要的位置。

一個常見的設計模式是負責顯示另一個VC的VC是確定它是否應該被解僱的VC。這也使您可以靈活地在需要時更新UI,然後再回到以前的視圖。

希望這是有道理的,是有幫助的。

+0

我結束了@ keithbhunter的解決方案,但肯定會嘗試這一個... – Whirlwind

相關問題