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 的主要优势是啥?