如何在 iOS 9 中检测弹出框何时消失

How to detect when a popover is dismissed in iOS 9

我正在更新应用以使用通用故事板。我通过从一个按钮拖动到我的新 viewcontroller 并选择 'Present As Popover' 作为一种 segue,使用界面生成器创建了一个到新 viewcontroller 的弹出窗口 segue。

当用户在弹出窗口外按下(关闭它)时,我需要在呈现视图控制器中得到通知,以便我可以撤消他们的操作。我该怎么做?

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

不确定您指的是哪种方法已弃用,但您仍然可以使用 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
    }
}

然后使用

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)

处理其解雇的方法。

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
    }
}

然后您可以使用委托方法以您之前预期的方式处理解雇检测。

此问题的更新答案。

全部归功于此

你必须在 iOS 13 上使用的方法: - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController

UIPopoverPresentationControllerDelegate 继承自 UIAdaptivePresentationControllerDelegate,正如 Beto 指出的那样,它包含 presentationControllerShouldDismisspresentationControllerDidDismiss

我只是将这些函数的弹出版本中的代码移到了 UIAdaptivePresentationControllerDelegate 版本中,它们的工作方式与以前完全相同。

不必更改视图控制器上的委托声明或设置 isModalInPresentation

原始代码在 13.2.3 下仍然有效,但这些功能已被贬值,总有一天它们会停止工作......还是不行?

我的应用程序是一个 iPad 应用程序,使用弹出窗口而不是演示文稿或卡片样式。