UINavigationController
是在 iOS 開發當中大量使用到的一個元件,我們可以用 pushViewController:animated:
切換到下一層 view controller,也可以用 popViewControllerAnimated:
回到上一層,或是用 popToRootViewControllerAnimated:
回到最上層的 root view controller。不過這些動作都得透過某種方式來觸發,例如按下某顆按鈕然後就可以回到上一層。
舉例來說,我現在有三個 view controllers 在 UINavigationController 裡頭,分別是「商品頁」、「結帳頁」、「結果頁」,流程很簡單,就是讓使用者點選喜歡的商品之後,切換到結帳頁面,結帳成功之後會顯示結果,然後使用者點了左上角的「Back」就會回到商品頁(因為已經結帳成功了,不應該回到結帳頁)。
〔商品頁〕 +-->〔結帳頁〕+-->〔結果頁〕
^ +
| |
+--------------------------+
我最常看到的作法是,自訂 leftBarButtonItem
或 backBarButtonItem
,當使用者點下之後就會呼叫 popToRootViewControllerAnimated:
讓畫面回到「商品頁」,只不過我覺得這樣有點麻煩,所以我最近改用另一個方法。
我現在的作法是這樣:以這個例子來說,我會在「結帳頁」呼叫 pushViewController:animated:
切換到「結果頁」之後,把「結帳頁」從 UINavigationController 的 viewControllers
當中抽掉。
[self.navigationController pushViewController:resultViewController animated:YES];
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[viewControllers removeObject:self];
self.navigationController.viewControllers = viewControllers;
把自己從navigationController 的 stack 中移除也算是不錯的做法,但是比較好的 UX 可能是結帳完成後,用 presentViewController 的方式把結果頁叫出來,這樣只要右上角定義一個完成來 dismiss 自己,同時結帳頁面也被從 stack 中移除 .. 一點個人淺見 :D
就設計上來說,結帳完成的頁面,不要讓用戶按 back,而是按頁面一個特別的按鍵(如結帳完成),是不是更好?退回鍵的本意就是退回。也就是,在結帳完成頁面,要隱藏退回鍵。