自定义 segue 到导航控制器层次结构中的特定子视图

Posted

技术标签:

【中文标题】自定义 segue 到导航控制器层次结构中的特定子视图【英文标题】:Custom segue to specific sub-view in navigation controller hierarchy 【发布时间】:2018-09-19 23:07:56 【问题描述】:

我在情节提要中有一个注册向导流程,它是一个导航控制器(作为情节提要入口点),在导航栏中带有普通的后退/下一步按钮,然后是 4 个子步骤场景,其中显示/推送转场转换呈线性链。

通常我自定义 segue 到情节提要的导航控制器,然后向导从第一步开始,一切都很好。

但从应用程序的另一点来看,我需要模态地转到其中一个子步骤(不是第一个),并且我不想将整个视图和控制它的类复制/粘贴到一个全新的导航控制器链,所以我想我可以直接使用它(并动态调整后退/下一步按钮中发生的事情)。

所以我尝试继承 UIStoryboardSegue 来为此做一个自定义的 segue,它的 sceneNamed 方法是这样的:

return [storyboard instantiateViewControllerWithIdentifier:sceneName];

它可以工作,但是由于我们实例化了子场景的视图控制器而不是导航控制器,我看到了场景但没有得到导航栏..

另一方面,如果我继续使用导航控制器,它会像往常一样从第一个链接的场景开始。

有什么方法可以欺骗 UIKit 进入导航控制器,但让它从正常层次结构/流程更下方的场景开始?

是的,我知道这很骇人听闻;还有其他解决方案(例如,在这种情况下,我可以以编程方式添加后退/下一步按钮)。只是好奇。

【问题讨论】:

你说“调整后退/下一个按钮”。这意味着该安排不应与您最初按 push push 到达该场景时的安排相同。你能多说一下现在应该的安排吗? @matt 所以,我要重复使用的子视图是服务条款接受视图,它通常在注册流程中,但我想从登录视图以模态方式发出它,如果用户尚未接受最新的 ToS。因此,在注册流程中,“后退/下一步”按钮“正常”运行并具有与 Interface Builder 相关的 segue,但是当以登录模式方式使用时,我想我会将它们的操作挂钩为“拒绝”和“接受”而是手动处理转换。我同意将程序化的东西与情节提要的东西混合起来似乎越来越愚蠢...... 那么你想要的只是一个只包含这个 ToS 视图的导航控制器吗?那么为什么不在故事板中配置呢?另一个导航控制器,其根视图控制器是同一个 ToS 控制器(无需“复制”任何内容)。 【参考方案1】:

那么为什么不像这样连接转场:

Navigation Controller (sign up) ->
  VC1 -> VC2 -> Terms of Service -> VC3
                       ↑
Login View ->          |                          
     Navigation Controller

这样,您只需通过两种不同的方式来访问服务条款视图控制器,而无需复制它。您可以使用 Storyboard Reference 对象来配置它,而不会有一堆纵横交错的箭头破坏故事板。

【讨论】:

没错,在稍微摆弄之后,我得出了一个类似的结论——最初我错过了我的登录视图实际上已经有一个导航控制器,它只是有一个隐藏的导航栏。因此,通过取消隐藏它并转到 ToS 页面,我得到了带有导航栏项目的 ToS 页面(来自 Login View 导航控制器)。

以上是关于自定义 segue 到导航控制器层次结构中的特定子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 viewControllers 的导航控制器设置自定义 segue 操作

自定义 segue 过渡动画

Swift:嵌入在导航控制器中的视图之间的自定义segue

使用自定义 segue 在导航堆栈上向后移动

单击导航栏中的“返回”按钮时如何设置自定义视图控制器?

自定义 segue 和导航控制器动画故障