如何在iOS 9中检测弹出窗口何时被解除

Mar*_*ges 11 ios uipopover uistoryboardsegue universal-storyboard ios9

我正在更新应用程序以使用通用故事板.我已经使用界面构建器创建了一个popover segue到一个新的viewcontroller,方法是从一个按钮拖动到我的新viewcontroller并选择'Present As Popover'作为segue的类型.

当用户按下弹出窗口(解除它)时,我需要在呈现视图控制器中得到通知,以便我可以撤消他们的操作.我怎样才能做到这一点?

通常我会手动创建popover并使我的viewcontroller成为popover的委托; 允许我使用popoverControllerDidDismissPopover委托回调.但是,这在iOS9中已被弃用,即使不是我也不知道在哪里找到popover所以我可以将其委托设置为我的视图控制器.

Pet*_*oti 13

不确定您所指的哪种方法已被弃用,但您仍然可以使用它UIPopoverPresentationControllerDelegate来实现此目的.就像是:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "popoverSegue" {
        let vc = segue.destinationViewController
        sortVC.modalPresentationStyle = .Popover
        sortVC.popoverPresentationController?.sourceRect = filterButton.bounds
        sortVC.preferredContentSize = CGSizeMake(216, 150)
        sortVC.popoverPresentationController!.delegate = self
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)
Run Code Online (Sandbox Code Playgroud)

处理解雇的方法.

  • 请记住,只有在弹出窗口自身消失时才会调用didDismiss函数,例如在其外部触摸.如果您自己使用自己的代码(例如按下按钮)将其解雇,则不会调用它. (7认同)

Dan*_*ang 8

popoverControllerDidDismissPopover:方法已被替换为popoverPresentationControllerShouldDismissPopover:因为 UIPopoverControllerDelegate已被替换为UIPopoverPresentationControllerDelegate.

从您的呈现视图控制器,符合新协议并设置弹出窗口控制器的委托prepareForSegue::

class MyPresentingViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {         
        if let popoverPresentationController = segue.destinationViewController.popoverPresentationController {
            popoverPresentationController.delegate = self
        }
    }

    func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用委托方法以您以前的方式处理解雇的检测.