Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:从不同的视图控制器委托调用segue_Swift_Segue - Fatal编程技术网

Swift:从不同的视图控制器委托调用segue

Swift:从不同的视图控制器委托调用segue,swift,segue,Swift,Segue,我有一个viewcontroller,我从中调用一个popover,在popover中我有一个委托,它在主viewcontroller中调用一个函数 在这个函数中,我关闭popover并希望加载不同的视图控制器 如果我这样做的话,原来的popover的关闭是有效的 func KeypadDismissData(View: UIViewController, Password : String){ View.dismissViewControllerAnimated(true, compl

我有一个viewcontroller,我从中调用一个popover,在popover中我有一个委托,它在主viewcontroller中调用一个函数

在这个函数中,我关闭popover并希望加载不同的视图控制器

如果我这样做的话,原来的popover的关闭是有效的

func KeypadDismissData(View: UIViewController, Password : String){
    View.dismissViewControllerAnimated(true, completion: nil)  
} 
但是,如果我尝试调用segue来加载带有代码的新视图控制器

func KeypadDismissData(View: UIViewController, Password : String){
    View.dismissViewControllerAnimated(true, completion: nil)
    self.performSegueWithIdentifier("LoginToMain", sender:nil)
}
我得到了错误

Warning: Attempt to present <UIViewController: 0x7fc768488900> on ... whose view is not in the window hierarchy!
你知道我该怎么解决这个问题吗


谢谢

我不确定是否了解您的问题,但我可以尝试:

您可以在MainViewController中打开一个popover。要解除此popover,请使用委托,在MainViewController中解除此popover。在弹出框关闭后,您需要切换到另一个视图

我重新创建了它,代码如下所示:

主视图控制器:

protocol DismissDelegate: class {
    func dismiss()
}

class ViewController: UIViewController, DismissDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func openButton(sender: UIButton) {
        let popoverViewController = storyboard?.instantiateViewControllerWithIdentifier("popoverViewController") as! PopoverViewController
        popoverViewController.modalPresentationStyle = .Popover
        popoverViewController.delegate = self
        popoverViewController.preferredContentSize = CGSize(width: 200, height: 260)
        popoverViewController.view.backgroundColor = UIColor.yellowColor()

        // Settings for the popover
        let popover = popoverViewController.popoverPresentationController!
        popover.sourceView = self.view
        popover.sourceRect = sender.frame
        popover.backgroundColor = UIColor.redColor()

        presentViewController(popoverViewController, animated: true, completion: nil)
    }

    func dismiss() {
        dismissViewControllerAnimated(true) {
            self.performSegueWithIdentifier("segue", sender: self)
        }
    }
}
class PopoverViewController: UIViewController {

    weak var delegate: DismissDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func dismissButton(sender: UIButton) {
        delegate?.dismiss()
    }
}
PopOverview控制器:

protocol DismissDelegate: class {
    func dismiss()
}

class ViewController: UIViewController, DismissDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func openButton(sender: UIButton) {
        let popoverViewController = storyboard?.instantiateViewControllerWithIdentifier("popoverViewController") as! PopoverViewController
        popoverViewController.modalPresentationStyle = .Popover
        popoverViewController.delegate = self
        popoverViewController.preferredContentSize = CGSize(width: 200, height: 260)
        popoverViewController.view.backgroundColor = UIColor.yellowColor()

        // Settings for the popover
        let popover = popoverViewController.popoverPresentationController!
        popover.sourceView = self.view
        popover.sourceRect = sender.frame
        popover.backgroundColor = UIColor.redColor()

        presentViewController(popoverViewController, animated: true, completion: nil)
    }

    func dismiss() {
        dismissViewControllerAnimated(true) {
            self.performSegueWithIdentifier("segue", sender: self)
        }
    }
}
class PopoverViewController: UIViewController {

    weak var delegate: DismissDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func dismissButton(sender: UIButton) {
        delegate?.dismiss()
    }
}
不同的是,我已经把segue放在了dismissViewControllerAnimated的末尾