如何在展开功能中执行segue

use*_*171 1 ios uistoryboard segue uistoryboardsegue

我有3个MVC,在这里命名为A,B,C.

A是主MVC,按钮"Menu"通过popover segue连接到B.

A还连接到C,手动显示segue.

B是一个弹出窗口MVC,按钮"Detail"连接到A,带有展开segue.

C是具有详细信息的细节MVC.

在A.的展开函数内部,我调用performSegueWithIdentifier来显示C.


预期的行为是

  • 单击B中的"详细信息"按钮
  • B消失,A出现
  • C出现了

但运行我得到的应用程序.

  • 单击B中的"详细信息"按钮
  • B消失,A出现
  • C出现了
  • C消失,A出现

C突然出现并消失,这不是我想要的.


一些额外的信息

  • 更多按钮需要Popover B.
  • A嵌入在UINavigationController中.连接A - > C而不是B - > C,用于C顶部的后退按钮.

use*_*171 6

似乎unwind函数不是调用performSegueWithIdentifier的正确位置.

调用unwind函数后, UIKit将弹出视图控制器.

因此,在unwind功能中推送新视图控制器将快速弹出.

解决方案是延迟performSegueWithIdentifier.

解决方案1:不工作

添加bool实例并在viewDidAppear中使用此实例来确定我们是否执行segue.

如果B控制器是一个弹出框,将无法工作.B弹出消失后,不会为A控制器调用viewDidAppear.

解决方案2:工作

将performSegueWithIdentifier推入主队列.

@IBAction func unwind(segue : UIStoryboardSegue) {
    dispatch_async(dispatch_get_main_queue()) {
        self.performSegueWithIdentifier("SomeSegue", sender: self)
    }
}
Run Code Online (Sandbox Code Playgroud)