即时转场,在呈现视图之前
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
并决定是否应该显示B
或C
?
如果 viewcontroller B 不在栈底,我就得把它呈现在 viewcontroller D 上面,我相信将堆栈保持在最低限度是最佳选择。
【参考方案1】:
如果没有实际显示您转入的每个 ViewController,您就无法使用转场。仅在实际呈现 ViewController 后才调用 Segue,例如,您不能从 viewDidLoad
进行 segue。
跳过带有 segue 的 ViewController 的唯一选择是设置两个不同的 segue,一个选择“完整路径”,例如 A->B->C
,另一个跳过 B
、A->C
。所以你需要从A
和B
到C
。
当然,使用这种方法你不能使用 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()
。
【讨论】:
以上是关于即时转场,在呈现视图之前的主要内容,如果未能解决你的问题,请参考以下文章