取消发送方视图控制器后执行segue

时间:2017-04-20 18:18:21

标签: ios swift

基本上,我在幻灯片菜单中有一个按钮(它是自己的视图控制器,覆盖Origin屏幕的一部分,让我们称之为Menu),当时按下,执行模态segue到另一个控制器,让我们说Destination

有没有办法按下Menu中的按钮(转到Destination),我可以将Menu解除回Origin,然后转到Destination

这听起来很愚蠢,但我认为我之前看过应用程序。在我的情况下,想要这样做的原因是,一旦我按下"完成"在Destination上,当我希望将其转回Menu时,它会将该控制器解除回Origin。我无法从Origin执行回到Destination

代码:

这是我从Menu打开Origin的方式:

let interactor = Interactor()

@IBAction func openMenu(_ sender: AnyObject) {
    performSegue(withIdentifier: "openMenu", sender: nil)
}


@IBAction func edgePanGesture(sender: UIScreenEdgePanGestureRecognizer) {
    let translation = sender.translation(in: view)

    let progress = MenuHelper.calculateProgress(translationInView: translation, viewBounds: view.bounds, direction: .Right)

    MenuHelper.mapGestureStateToInteractor(
        gestureState: sender.state,
        progress: progress,
        interactor: interactor){
            self.performSegue(withIdentifier: "openMenu", sender: nil)
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destination as? MenuViewController {
        destinationViewController.transitioningDelegate = self
        destinationViewController.interactor = interactor
        destinationViewController.currentRoomID = self.currentRoomID
    }
}

这是prepareForSegueMenuDestination的{​​{1}}目前,没什么特别的:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    let inviteVC = segue.destination as! InviteVipViewController
    inviteVC.currentRoomID = self.currentRoomID
}

最后解雇Destination只是一个简单的

@IBAction func cancelButtonPressed(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}

我看到这个问题基本上是我试图做的,但遗憾的是没有答案:Performing segue after dismissing modal swift

很抱歉,如果这听起来令人困惑,但如果有人知道我在说什么,并且可以让我知道如何设置segues / prepareForSegue以使其正常工作,那么任何输入都将受到赞赏!

3 个答案:

答案 0 :(得分:7)

根据对this answer的修改,以下内容应该有效:

在故事板中,删除通过点击菜单按钮触发的segue,然后转到目标。

创建一个从Origin视图控制器到Destination视图控制器的新segue。这个segue将手动执行。

在菜单中选择目的地选项后,让菜单自行关闭,然后在原点上执行目标segue,如下所示:

    // This code goes in Menu, and you should call it when
    //    the menu button is tapped.
    //
    // presentingViewController is Origin
    weak var pvc = self.presentingViewController

    self.dismiss(animated: true) {

        // Menu has been dismissed, but before it is destroyed
        //  it calls performSegue on Origin
        pvc?.performSegue(withIdentifier: "openDestination", sender: nil)
    }

当目的地被解雇时,您应该看到Origin,而根本没有看到菜单。

我在一个示例应用程序中对此进行了测试,其中“Menu”不是幻灯片,而是一个完整的模态视图控制器,它对我有用。

编辑:在使用@KingTim进行故障排除时,他发现我们需要将segue从UINavigationController而不是Origin连接到目的地。这是因为Origin位于导航控制器内。在那次发现之后,它发挥了作用。

答案 1 :(得分:1)

如果您的展示视图嵌入在导航控制器中,那么您可以执行以下操作:

    weak var pvc:UIViewController! = self.presentingViewController?.childViewControllers[0]
    dismiss(animated: true)
    {
        pvc.performSegue(withIdentifier: "SegueID", sender: nil)
    }

答案 2 :(得分:0)

使用presentingViewController

的简单解决方案
if let destinationVC = self.presentingViewController as? YourViewController {
    destinationVC.isBooleanPassed = true
    destinationVC.selectedString = "here comes your string"
    destinationVC.selectedInteger = 12345
}

dismiss(animated: true, completion: nil)