即时转场,在呈现视图之前

Posted

技术标签:

【中文标题】即时转场,在呈现视图之前【英文标题】:Instant segue, before presenting view 【发布时间】:2017-08-21 13:03:13 【问题描述】:

我正在尝试为我的项目找出正确的视图控制器/segue 结构,我需要一些帮助。

当 'B' is 从 'A' 出现时,它会检查陈述是否为真。仅当为真时,才应立即显示“C”而不是“B”。用户继续'D',并且从'D'应该有一个展开segue回到'B'。

我可以检查 'B' 的 viewDidAppear() 中的 if 语句,但是视图会先加载几毫秒,然后再加载 viewcontroller 'C' .不好看。

如果我尝试在 viewDidLoad() 中创建 if 语句,我会收到错误:

试图在视图不在窗口层次结构中的“B”上显示“C

也许有更好的方法来解决这个问题?

【问题讨论】:

为什么不尝试从A呈现C,当用户弹出使用自定义过渡动画时。如果您在用户不知情的情况下推送多个视图控制器,Apple 可能会拒绝。 这会带来非常不寻常的用户体验,难道你不能重新设计整体以进入更常见的模型吗? 我认为有一种模棱两可的检查:“它检查一个陈述是否为真。只有当它为真时,'C'才应该立即出现而不是'B'。”所以你为什么只是检查A 并决定是否应该显示BC 如果 viewcontroller B 不在栈底,我就得把它呈现在 viewcontroller D 上面,我相信将堆栈保持在最低限度是最佳选择。 【参考方案1】:

如果没有实际显示您转入的每个 ViewController,您就无法使用转场。仅在实际呈现 ViewController 后才调用 Segue,例如,您不能从 viewDidLoad 进行 segue。

跳过带有 segue 的 ViewController 的唯一选择是设置两个不同的 segue,一个选择“完整路径”,例如 A->B->C,另一个跳过 BA->C。所以你需要从ABC

当然,使用这种方法你不能使用 unwind segue 到一个根本没有呈现的 ViewController。您可以通过不使用展开转场来解决此问题,但也可以通过“向后”设置转场来解决此问题。我所说的“后退”是指你设置了一个segue 说D->B,然后即使你的segue 的顺序是A->C->D->B,你也可以“返回”到B

【讨论】:

我觉得它会形成一个非常复杂的结构.. i.stack.imgur.com/oTC0m.png 这是 segues 的设计限制。除非您将导航完全更改为不使用 segue,否则我看不到任何其他方法可以以不太复杂的方式实现您所需要的。【参考方案2】:

我想我终于找到了一个非常巧妙的解决方案。我添加了另一个视图控制器,它包含两个容器视图 - 一个嵌入“B”,另一个包含“C”。应该显示哪个容器由这两个简单的函数管理:

func switchToB() 
    containerB.isHidden = false
    containerC.isHidden = true


func switchToC() 
    containerB.isHidden = true
    containerC.isHidden = false

我让 'D' 展开到新的视图控制器,然后触发 switchToC()

【讨论】:

以上是关于即时转场,在呈现视图之前的主要内容,如果未能解决你的问题,请参考以下文章

Android官方开发文档Training系列课程中文版:动画视图之转场框架介绍

呈现模态视图总是失败

自定义Controller转场动画

提交前 Swift segue 自定义转换布局

iOS7 - 从表格视图推送转场期间内容重叠

如何在多个 .xib 文件之间执行展开转场(不使用情节提要)