12

我正在更新一个应用程序以使用通用故事板。我已经使用界面生成器创建了一个弹出框到新视图控制器的弹出框,方法是从一个按钮拖动到我的新视图控制器并选择“作为弹出框呈现”作为一种segue。

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

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

4

4 回答 4

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

然后使用

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)

处理其解雇的方法。

于 2015-11-02T00:02:17.557 回答
9

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

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

于 2015-11-02T00:51:25.980 回答
1

正如 Beto 指出的那样,UIPopoverPresentationControllerDelegate继承自UIAdaptivePresentationControllerDelegate其中包含presentationControllerShouldDismissand 。presentationControllerDidDismiss

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

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

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

我的应用程序是使用弹出框而不是演示文稿或卡片样式的 iPad 应用程序。

于 2019-12-01T05:21:39.433 回答
1

此问题的更新答案。

这个答案的所有功劳:

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

于 2019-11-07T19:37:43.823 回答