SFSafariViewController
是苹果提供的一个用于在应用内打开网页内容的控制器,它允许用户在应用内浏览网页,同时保持原生的用户体验。UITabBarController
是 iOS 中用于管理多个视图控制器的容器,通常用于底部导航栏。
如果你在使用 SFSafariViewController
时遇到了它解雇(dismiss)了 UITabBarController
的问题,这通常是因为 SFSafariViewController
被当作模态视图控制器(modal view controller)呈现,而模态视图控制器在关闭时会自动解雇其父视图控制器。
为了防止这种情况,你可以尝试以下几种方法:
将 SFSafariViewController
放入一个自定义的 UINavigationController
中,然后将这个导航控制器作为模态视图控制器呈现。这样,当 SFSafariViewController
关闭时,它会返回到自定义导航控制器,而不是直接解雇 UITabBarController
。
let safariViewController = SFSafariViewController(url: URL(string: "https://example.com")!)
let navigationController = UINavigationController(rootViewController: safariViewController)
navigationController.modalPresentationStyle = .fullScreen
present(navigationController, animated: true, completion: nil)
SFSafariViewController
的关闭事件你可以监听 SFSafariViewController
的关闭事件,并在其关闭后重新呈现 UITabBarController
。
let safariViewController = SFSafariViewController(url: URL(string: "https://example.com")!)
safariViewController.delegate = self
present(safariViewController, animated: true, completion: nil)
然后实现 SFSafariViewControllerDelegate
方法:
extension YourViewController: SFSafariViewControllerDelegate {
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
// Safari view controller finished, re-present the tab bar controller
dismiss(animated: true, completion: nil)
}
}
如果可能,避免将 SFSafariViewController
作为模态视图控制器呈现。你可以考虑将其嵌入到一个页面内的容器视图中,而不是全屏呈现。
通过上述方法,你应该能够防止 SFSafariViewController
解雇 UITabBarController
,从而保持应用的导航结构不被破坏。
领取专属 10元无门槛券
手把手带您无忧上云