直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构
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,同时保留层次结构?
通过以编程方式修改UINavigationController
的viewControllers
数组层次结构。
假设,您当前在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 页面,是的。但是您不知道有任何替代方法可以做到这一点,对吧?以上是关于直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构的主要内容,如果未能解决你的问题,请参考以下文章