直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构

Posted

技术标签:

【中文标题】直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构【英文标题】:Present deeply-nested view controller directly from anywhere whilst retaining hierarchy 【发布时间】:2017-02-19 21:37:14 【问题描述】:

我正在做一个大项目,堆栈如下。

我有一个 UITabBarController,每个标签都有一个 UINavigationController,包含一个或多个 UIViewController。

UITabBarController > UINavigationController > UIViewController1 > UIViewController2 > ...

正常的流程是用户点击每个视图控制器。但是,我怎样才能将应用程序直接打开到UIViewController2,同时保留层次结构?

我明确不想从 AppDelegate 呈现模态视图或将视图控制器推送到其他地方。所需的行为类似于聊天应用程序,打开特定的聊天UIViewController2(例如,来自推送通知),但仍然可以“返回”到聊天列表视图 (@987654323 @ 在此示例中),即使应用程序直接启动到 UIViewController2 并且从未出现过 UIViewController1

另一个用例是从另一个选项卡而不是 AppDelegate 执行相同的操作。从选项卡 2 的某处,打开选项卡 1 内的 UIViewController2

如何做到这一点?我想到了不同的选择,但不知道如何实现它们

像往常一样构建层次结构,但不将其呈现给用户,当达到UIViewController2 时,呈现所有内容? 现在UIViewController2 然后默默地在它上面建立层次结构?

【问题讨论】:

【参考方案1】:

但是我怎样才能将应用程序直接打开到 UIViewController2,同时保留层次结构?

通过以编程方式修改UINavigationControllerviewControllers 数组层次结构。 假设,您当前在UIViewController2,一些构建后台堆栈层次结构的示例代码可以是:

NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
UIViewController1 *VC1 = [UIViewController1 new]; 
[controllers insertObject:VC1 atIndex:(controllers.count - 1)]; // choose the index
self.navigationController.viewControllers = controllers;

执行此操作的好地方是当前呈现的视图控制器的viewDidLoad

【讨论】:

哇!谢谢!我认为这可能是解决方案(正如我所提到的),但不知何故认为这会更加复杂并且会破坏一切。 @GuillermoSuárezAsencio 很高兴听到这个消息 :) 我目前正在使用URLNavigatior 来启动 vcs。对于如何将上述讨论的功能直接实现到这种基于 URL 的导航器中,您是否有替代/建议或聪明的想法?我现在可以分别打开/chat/<id>/chats,但想调用/chats/chat/<id> 并让导航器执行我们刚才讨论的操作,打开聊天并在其上方创建层次结构。只是如果你有一个想法或知道一个做这种事情的导航器:) 天啊! URLNavigator 看起来很酷,但不幸的是我没有使用它的经验。您应该在图书馆的 github 页面上发布此查询以供作者输入。 我会玩一点,否则会将其发布到其 github 页面,是的。但是您不知道有任何替代方法可以做到这一点,对吧?

以上是关于直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义表格视图单元格中识别的点击手势从 UILabel 呈现视图控制器?

在动画呈现控制器视图的同时动画呈现控制器视图

iOS - 在其顶部呈现模式后保留视图控制器状态

从 UISplitView 呈现全屏模式视图?

关闭从模态呈现的视图控制器翻转的视图控制器

iOS:从任何地方返回根视图控制器