如何使用 sub-areas/routes 处理 iOS 应用程序的导航

How to approach navigation for an iOS app with sub-areas/routes

我是 objective-c/iOS 开发的新手,正在努力寻找有关如何在给定应用程序菜单结构的情况下构建导航的指南,例如:

我正在使用 ECSlidingViewController 来显示导航菜单(即顶层导航被隐藏并且不显示标签栏控制器)。

我有 Web 开发背景,所以我习惯于具有路由 (URL) 并且能够从任何地方加载任何路由的单独视图。

我想我了解如何使用 UINavigationController(或者至少我认为我了解)来处理顺序导航,例如(主页 > 开始订单 > select 商店等),其中返回(弹出)是有意义的,但我有点担心我在非结构化导航方面遗漏了一些东西。

例如,如果我在结帐视图(主页导航层次结构中的几个控制器),并且我决定点击菜单(菜单滑出)和 select 我的帐户,fiddle 使用我的详细信息,然后点击菜单和主页,我希望回到导航到我的帐户之前的位置(即在结帐页面上)。

这种导航的标准做法是什么?我正在查看诸如 routable-ios 之类的库,但没有足够的经验来判断这是否是一种不错的方法。


我考虑过以下方法:

  1. 维护一个高级 UINavigationController,它维护一个子 UINavigationController 数组,即 [HomeNavigationController、AccountNavigationController、OrderHistoryNavigationController]
  2. 首先,主导航控制器将加载指向 "Home" 作为根视图的 HomeNavigationController,然后用户将在 push/pop 按预期工作的订单流程中前进。
  3. 如果用户点击“我的帐户”,我会将主导航控制器阵列重置为帐户导航控制器(帐户视图控制器将是根),用户将继续在那里。我会在 HomeNavigationController 上保留一个句柄,以便在用户点击菜单、主页时保持用户的位置(即我会将主导航控制器重置回 HomeNavigationController 引用,堆栈将处于他们点击我之前的状态帐户)。

为什么这是一个糟糕的方法有什么原因吗?

每当我使用 ECSlidingViewController 时,通常最简单的方法是为每个视图控制器分配 Storyboard ID。这样,当您 select 菜单中的特定项目时,您可以根据情节提要 ID 显示视图控制器,如下所示:

UIViewController *newTopVC = [self.storyboard instantiateViewControllerWithIdentifier:@"topViewController"];

CGRect frame = self.slidingViewController.topViewController.view.frame;
self.slidingViewController.topViewController = newTopViewController;
self.slidingViewController.topViewController.view.frame = frame;
[self.slidingViewController resetTopView];

这是我从以前版本的 ECSlidingViewController 中得到的示例,但一般概念应该是相同的。您只需要确保要呈现的视图控制器具有您在代码中指定的相同标识符。您可以在情节提要中找到标识符... select 视图控制器并查看身份检查器。将有一个 "Identity" 部分列出 "Storyboard ID"。

如果您选择使用 nib 文件而不是故事板,您可以将第一行替换为以下内容:

UIViewController *newTopVC = [[UIViewController alloc] initWithNibName:@"TopViewController" bundle: nil];

如果你走这条路,你从菜单实例化的视图控制器本身可以是不同菜单项的导航控制器,这样用户就可以按预期在该菜单功能中前进和后退。

我看到的这种方法的最大问题是跟踪控制器的复杂性(您的要点 3。)这可能会变得丑陋。

此外,Apple 坚决认为滑块菜单不是一个好主意。并不是说你必须接受 Apple 对此的意见,但这是需要考虑的事情。

处理这种导航的一种常见方法是使用 UITabController。例如,请参阅 "iTunes Store" 应用程序甚至 "Phone" 应用程序。

我使用选项卡栏来划分不同的功能集,其中一些选项卡包含 UINavigationControllers。我觉得很有效。

这些选项卡允许用户在应用程序的各个部分之间轻松切换,而不必丢失它们的位置。每个选项卡都保留在内存中,您无需编写逻辑来在选项卡更改时交换视图控制器。

当然,当用户 returns.

时,您仍然需要考虑用户在切换到不同选项卡时所做的更改应该如何影响当前选项卡。

例如,如果用户在订单选项卡中进行购买,然后切换到帐户选项卡进行登录,那么当用户 returns 到订单选项卡时,是否会影响订单流程?或许您应该在订购流程中提供简化的登录视图,这样用户就不必切换到不同的选项卡。

无论您采用哪种导航方法,这些都是您需要考虑的事项。不过,我的建议是仔细查看 UITabController,看看它是否适合您。