手动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
相关产品推荐
相关产品推荐

