You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动dismiss弹窗后,如何触发popoverPresentationControllerDidDismissPopover代理方法

解决手动关闭Popover后代理方法未触发的问题

我来帮你捋清楚这个问题哈~ 你遇到的情况其实是系统的设计逻辑导致的:popoverPresentationControllerDidDismissPopover这个代理方法只有当用户通过系统默认交互(比如点击Popover外部区域)关闭弹窗时,系统才会自动调用。而你是通过代码手动调用dismiss(animated:completion:)来关闭的,这种场景下系统不会主动触发这个代理回调,得我们手动处理或者调整逻辑。

下面给你两种可行的解决方案:

方案一:手动触发代理方法

在你的dismissPresentedViewController()方法里,在dismiss完成的回调中主动调用代理方法即可。注意要做好可选值判断,避免空指针,同时用弱引用防止循环引用:

func dismissPresentedViewController() {
    self.presentedViewController?.dismiss(animated: true) { [weak self] in
        guard let self = self,
              let popoverDelegate = self.popoverPresentationController?.delegate else {
            return
        }
        // 手动调用代理方法
        popoverDelegate.popoverPresentationControllerDidDismissPopover?(self.popoverPresentationController!)
    }
}

方案二:确保代理设置正确(前置检查)

在尝试上面的方案之前,先确认你已经正确完成了代理的设置,这是代理方法能被触发的基础:

  • 弹出Popover的ViewController需要遵循UIPopoverPresentationControllerDelegate协议
  • 必须给popoverPresentationController的delegate属性赋值

比如弹出Popover的代码应该类似这样:

func showPopover() {
    let popoverVC = YourPopoverViewController()
    popoverVC.modalPresentationStyle = .popover
    
    guard let popoverPresenter = popoverVC.popoverPresentationController else {
        return
    }
    popoverPresenter.delegate = self // 关键:设置代理
    popoverPresenter.sourceView = self.view
    popoverPresenter.sourceRect = CGRect(x: 100, y: 100, width: 0, height: 0)
    
    present(popoverVC, animated: true)
}

如果你的业务场景允许,也可以尽量让用户通过系统默认交互关闭Popover(比如点击外部),这种情况下系统会自动触发popoverPresentationControllerDidDismissPopover方法,不需要额外处理。

内容的提问来源于stack exchange,提问作者user979331

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:28:21