假设我有3个ViewControllers - A,B和C. A显示B,B显示C.然后我想回到A而不经过(视觉上)B(如主页按钮)。我现在的问题是,当我放松到A时,会显示短时间B(调用viewWillAppear等方法)。我该如何解决这个问题?
注1:与我的真实应用导航树相比,上面的示例高度简化,对于我来说,使用NavigationController作为所有A,B和C的容器是不可能的(或者至少不可取)。转换过程中很少有原因导致所有视图中存在复杂的嵌入段和不同的自定义转换(几乎所有动画转换都完全不同)。
注意2:我找到了一些伪解决方案,用于定义自定义segue并将其用作自定义Unwind Segue。这也是不可取的,因为我想使用我已经完成的过渡动画师。
非常感谢任何帮助。
答案 0 :(得分:2)
请注意,这是一个经修正的答案 - 回应下面的第一条评论。
我有一个似乎有效的解决方案。但这可能不合适。我不确定,只是考虑它。
3个视图控制器的设置如问题中所述(第二个是红色的,以便我注意它在展开过程中是否可见)。
通过拖动到Exit,在第三个视图控制器(C)中创建展开segue。在执行此操作之前,必须将所需操作添加到第一个和第二个视图控制器。
以下是3个视图控制器的代码。我的修复 - 我使用一个名为unwindCheck
的全局布尔值作为标记,在展开之前设置为true
,否则为false
。如果是true
,则self.view.hidden = true
中的viewWillAppear
用于第二个视图控制器。即在放松期间隐藏。
请注意,我还在第三个视图控制器上添加了第二个按钮 - 它调用相同的展开segue - 其标识符属性设置为"UnwindToFirstSegue"
。第二个按钮不是这种可能解决方案的必要部分。
class FirstViewController: UIViewController {
@IBAction func unwindToFirstViewController(segue: UIStoryboardSegue) {
}
override func viewDidLayoutSubviews() {
unwindCheck = false
}
}
class SecondViewController: UIViewController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if unwindCheck == true {
self.view.hidden = true
}
}
@IBAction func unwindToSecondViewController(segue: UIStoryboardSegue) {
}
}
class ThirdViewController: UIViewController {
@IBAction func backToA(sender: AnyObject) {
performSegueWithIdentifier("UnwindToFirstSegue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier{
switch identifier {
case "UnwindToFirstSegue":
unwindCheck = true
default:
break
}
}
}
}
展开segue的标识符可以通过在Document Outline中选择它然后转到Attributes检查器来设置。