微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

有没有办法按下菜单中的按钮(转到目的地),我可以将菜单关闭回原点,然后转到目的地?

这听起来很傻,但我认为我以前见过应用程序.在我的情况下,想要这样做的原因是,一旦我在Destination上按下“完成”,它就会将该控制器解除回菜单,当我希望它只是关闭回原点时.我不能只是将一个segue执行回Origin from Destination.

码:

这是我从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
    }
}

这是我目前从菜单到目的地的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)
}

我看到这个问题基本上就是我要做的,但不幸的是没有答案:Performing segue after dismissing modal swift

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

解决方法

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

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

创建一个从Origin视图控制器到Destination视图控制器的新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,而根本没有看到菜单.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐