SFSafariViewController 未正确关闭 (iOS 10.3)

Posted

技术标签:

【中文标题】SFSafariViewController 未正确关闭 (iOS 10.3)【英文标题】:SFSafariViewController not dismissing properly (iOS 10.3) 【发布时间】:2017-06-28 00:42:42 【问题描述】:

在我的应用程序中,我有一个SFSafariViewController,我正在模态显示。关闭后,呈现的 ViewController 不会调用其 dismiss 方法。我的UIViewController子类的代码:

override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) 
    print("will present")
    super.present(viewControllerToPresent, animated: flag) 
        completion?()
        print("did present")
    


override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) 
    print("will dismiss)")
    super.dismiss(animated: flag) 
        completion?()
        print("did dismiss")
    


func safariViewControllerDidFinish(_ controller: SFSafariViewController) 
    print("finished with \(controller)")



func testSVC() 
    let svc = SFSafariViewController(url: URL(string: "https://www.***.com")!)
    svc.delegate = self

    self.present(svc, animated: true) 
        print("presented \(svc)")
    

调用testSVC(),然后在 SafariViewController 中点击“完成”会产生以下输出:

will present
presented <SFSafariViewController: 0x7fd981b2f200>
did present
finished with <SFSafariViewController: 0x7fd981b2f200>

就是这样。缺少dismiss 打印语句。谁能帮我弄清楚为什么没有调用dismiss?我以为所有UIViewController 的解雇都转发给了提交的UIViewController

【问题讨论】:

【参考方案1】:

当您关闭 SFSafariViewController 时,会触发 svc 的关闭方法,而不是您所在的 ViewController。如果您想覆盖 SFSafariViewController 的关闭,那么您应该将其子类化并覆盖该子类中的关闭函数。

【讨论】:

但是dismiss 方法不会被转发到呈现UIViewController 吗?在这种情况下,我要展示的代码是哪个。 文档确实说它应该传递给呈现视图控制器,但我刚刚测试过它并没有。我将 SFSafariViewController 子类化并覆盖了关闭函数,并且在按下完成时它被击中。你最好的选择是继承它。 一定是bug。因为在developer.apple.com/documentation/uikit/uiviewcontroller/… 它明确指出“呈现视图控制器负责解除它呈现的视图控制器。如果你在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现视图控制器处理解除。”

以上是关于SFSafariViewController 未正确关闭 (iOS 10.3)的主要内容,如果未能解决你的问题,请参考以下文章

c++ Run-Time Check Failure #0 - ESP 的值未正确保存在...检查简单工作线程的点

SFSafariViewController:隐藏导航栏

使用 SFSafariViewController 下载文档

使用 SFSafariViewController 的主要优势是啥?

如何在 SwiftUI 中使用 SFSafariViewController?

SFSafariViewController 显示任何 URL 的空白屏幕