繁体   English   中英

在发送方视图控制器被解除后执行 segue

[英]Performing segue after sender view controller is dismissed

基本上,我在滑出式菜单中有一个按钮(它是它自己的视图控制器,它覆盖了Origin屏幕的一部分,我们称之为Menu ),当按下时,它会执行到另一个控制器的模式切换,比如说Destination

有什么办法可以在按下Menu的按钮(转到Destination )后,我可以将Menu解散回Origin ,然后转到Destination

这听起来很傻,但我想我以前见过应用程序做的事情。 就我而言,想要这样做的原因是,一旦我在Destination上按下“完成”,它就会将该控制器解散回Menu ,而我希望它只是解散回Origin 我不能只是执行从Destination返回Origin

代码:

这就是我从Origin打开Menu

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
    }
}

这是我目前从MenuDestination prepareForSegue ,没什么特别的:

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)
}

我看到了这个问题,这基本上就是我想要做的,但不幸的是没有答案: 在解雇 modal swift 后执行 segue

抱歉,如果这听起来令人困惑,但如果有人知道我在说什么并且可以让我知道如何设置 segues/ prepareForSegue使其工作,任何输入将不胜感激!

基于对此答案的修改,以下应该有效:

在您的故事板中,删除通过点击菜单按钮触发的转场并转到目的地。

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

当您在 Menu 中选择 Destination 选项时,让 Menu 自行关闭,然后在 Origin 上执行 Destination 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)
    }

当 Destination 被关闭时,您应该会看到 Origin,而根本不会看到 Menu。

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

编辑:在使用@KingTim 进行故障排除时,他发现我们需要将转场从UINavigationController而非 Origin 连接到 Destination。 这是因为 Origin 位于导航控制器内。 在那个发现之后,它起作用了。

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

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

使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM