故事板popover被解雇,委托方法没有调用

Ash*_*lls 16 uipopovercontroller ios uistoryboard uistoryboardsegue

我有一个视图控制器,使用故事板segue在弹出框中显示.

在此输入图像描述

在呈现视图控制器中,我有以下代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let svc = segue.destinationViewController as? SettingsViewController {
        svc.popoverPresentationController?.delegate = self
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,事实证明,所呈现的视图控制器,即使它显示为酥料饼,具有modalPresentationStyle'.Modal,因此一个nil popoverPresentationController.奇怪的!

所以,我更新了代码如下:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let svc = segue.destinationViewController as? SettingsViewController {
        svc.modalPresentationStyle = .Popover
        svc.popoverPresentationController?.delegate = self
    }
}
Run Code Online (Sandbox Code Playgroud)

svc.popoverPresentationController代表现在设置好了,但如果酥料饼是由用户解雇攻外,没有任何的UIPopoverPresentationControllerDelegate委托方法(如popoverPresentationControllerShouldDismissPopover被调用.我在想什么?

Fir*_*iro 7

在这种情况下无需授权.如果presentingViewController(vc包含popover的任何内容)只是覆盖:

斯威夫特4

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    print("Dismiss: \(String(describing: self.presentedViewController))")
    super.dismiss(animated: flag, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
    // Before calling super get a handle on which controller is being dismissed
    print("Dismiss: \(self.presentedViewController)")
    super.dismissViewControllerAnimated(flag, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)

无论如何解雇,您都会收到通知.您也不需要在prepareForSegue:(至少处理此交互)中设置任何其他变量/设置.