解除发件人视图控制器后执行segue
基本上,我在滑出菜单中有一个按钮(它是自己的视图控制器,覆盖Origin
屏幕的一部分,我们称之为Menu
),当按下时,执行模态segue到另一个控制器,比如说Destination
。
有没有办法按下Menu
的按钮(转到Destination
),我可以将Menu
关闭回Origin
,然后转到Destination
?
这听起来很愚蠢,但我认为我以前见过应用程序。 在我的情况下,想要这样做的原因是,一旦我在Destination
上按下“Done”,它就会将该控制器移回Menu
,当我希望它只是关闭回Origin
。 我不能只执行一个segue回到Origin
from Destination
。
码:
这是我从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 } }
这是我目前从Menu
到Destination
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) }
我看到这个问题基本上就是我想要做的但不幸的是没有答案: 在解雇模态迅捷后执行segue
很抱歉,如果这听起来令人困惑,但如果有人知道我在说什么,并且可以让我知道如何设置segues / prepareForSegue
以使其正常工作,任何输入都将不胜感激!
根据对此答案的修改,以下内容应该有效:
在故事板中,删除通过点击菜单按钮触发的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) }
当Destination被解雇时,您应该看到Origin,而根本没有看到Menu。
我在一个示例应用程序中测试了这个,其中“Menu”不是幻灯片,而是一个完整的模态视图控制器,它对我有用。
编辑:在使用@KingTim进行故障排除时,他发现我们需要将来自UINavigationController
而不是Origin的segue连接到Destination。 这是因为Origin位于导航控制器内。 在那次发现之后,它起作用了。
如果您的演示视图嵌入在导航控制器中,那么您可以这样做:
weak var pvc:UIViewController! = self.presentingViewController?.childViewControllers[0] dismiss(animated: true) { pvc.performSegue(withIdentifier: "SegueID", sender: nil) }