如何直接回到 RootViewController

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,而是按頁面一個特別的按鍵(如結帳完成),是不是更好?退回鍵的本意就是退回。也就是,在結帳完成頁面,要隱藏退回鍵。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容