如何在iOS 9中检测弹出视图被关闭

13

我正在更新一个应用程序,以使用通用storyboards。我使用界面构建器通过从按钮拖动到新的视图控制器并选择“Present As Popover”作为segue类型来创建一个弹出窗口segue。

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

通常情况下,我会手动创建弹出窗口并使我的视图控制器成为弹出窗口的代理;这允许我使用popoverControllerDidDismissPopover委托回调。但是,在iOS9中已经弃用了此方法,即使没有弃用,我也不知道在哪里找到弹出窗口,以便我可以将其代理设置为我的视图控制器。

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)

处理其解雇的方法。


7
请记住,didDismiss函数只在弹出窗口自动消失时调用,比如点击它外面的区域。如果你通过自己的代码将其关闭(例如按下按钮),那么该函数将不会被调用。 - CMash
@CMash,你知道该怎么做吗? - emmics
@Muli,如果您必要的代码在didDismiss函数中,请在自己解除时自己调用didDismiss函数。或者编写一个包含必要代码的函数,并从可能解除它的所有位置调用它。 - CMash

9

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

从你的 presenting view controller 开始遵循新协议,并在 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
    }
}

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


1
这需要更新,因为现在popoverPresentationControllerShouldDismissPopover:也已经被弃用了。 - Logicsaurus Rex

2

这是关于此问题的更新答案。

所有荣誉归功于这个答案

iOS 13上必须使用的方法:

- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController

1

UIPopoverPresentationControllerDelegate继承自UIAdaptivePresentationControllerDelegate,其中包含Beto指出的presentationControllerShouldDismisspresentationControllerDidDismiss

我只是将我在弹出窗口版本中的代码移动到了UIAdaptivePresentationControllerDelegate版本中,它们的功能与以前完全相同。

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

原始代码仍然可以在13.2.3下工作,但这些函数已过时,有一天它们会停止工作...或者不会?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接