点击Safari完成按钮后执行代码?safariViewControllerDidFinish不触发如何解决
问题解决:SFSafariViewController点击完成后代理方法不触发
核心问题原因
- 代理设置时机错误:你先调用了
present方法展示SFSafariViewController,之后才设置delegate,会导致代理绑定未生效 - 代理方法位置错误:
safariViewControllerDidFinish方法被嵌套在了其他业务方法内部,没有放在QRScannerController类的顶级作用域,系统无法识别到这个代理实现 - 多余的dismiss调用:
safariViewControllerDidFinish触发时,系统已经默认会执行SFSafariViewController的dismiss操作,你在方法内主动调用controller.dismiss属于重复无效操作
修正后代码示例
import SafariServices class QRScannerController: UIViewController, WKNavigationDelegate, SFSafariViewControllerDelegate { // 示例:在触发打开Safari的业务方法内实现以下逻辑 func openSafari(urls: String) { guard let url = URL(string: urls) else { return } let vc = SFSafariViewController(url: url) // 先设置代理,再执行present操作 vc.delegate = self present(vc, animated: true, completion: nil) } // 代理方法必须放在类的顶级作用域,不能嵌套在其他方法内部 func safariViewControllerDidFinish(_ controller: SFSafariViewController) { // 无需手动调用dismiss,直接执行你的自定义代码即可 // do your code } }
内容的提问来源于stack exchange,提问作者Anci
相关产品推荐
相关产品推荐

