从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回

Posted

技术标签:

【中文标题】从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回【英文标题】:Call SFSafariViewController from UITabBarController and go back after "Done" pressed 【发布时间】:2019-06-10 12:31:37 【问题描述】:

我有一个带有自定义按钮的自定义 UITabBarController。当我单击此按钮时,我打开 SFSafariViewController - 这里一切正常。但是当我点击SFSafariViewController 中的 "done" 按钮时,它会被关闭。但我无法返回UITabBarController,我只看到我在应用程序委托窗口中添加的背景颜色。

示例代码:

class TabBar: UITabBarController, UITabBarControllerDelegate, SFSafariViewControllerDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
        delegate = self
    

    func setupCenterButton() 
        let centerButton = CenterButton(frame: CGRect(x: 0, y: 0, width: 74, height: 74))
        centerButton.layer.cornerRadius = 37
        centerButton.frame.origin.y = self.tabBar.frame.minY - 37
        centerButton.frame.origin.x = view.bounds.width/2 - 37
        centerButton.setImage(UIImage(named: "google"), for: .normal)
        centerButton.addTarget(self, action: #selector(openURL), for: .touchUpInside)
        view.addSubview(centerButton)
        view.layoutIfNeeded()
    

    @objc func openURL() 
        let termsURL = SFSafariViewController(url: URL(string: "https://google.ru")!)
        termsURL.modalPresentationStyle = .currentContext
        termsURL.delegate = self
        self.present(termsURL, animated: true, completion: nil)
    

如何在SFSafariViewController 之后显示UITabBarController

【问题讨论】:

您需要实现safariViewControllerDidFinish委托方法并实际关闭Safari视图控制器;您的标签栏控制器被“空”的 Safari 视图控制器隐藏。 这种方法应该怎么做? controller.dismiss(animated: true, completion: nil) 不起作用 为什么要在TabBarController中调用这个?如果您打算将此按钮添加到 tabor,那么答案可能会对您有所帮助,但否则,我将在 TabBarController 中设置一个 Viewcontroller 并在 ViewController 中创建此按钮和 SFSafariViewController。 补充一下,我发现更改 SafariVC 的 .modalPresentationStyle = .overCurrentContext 实现了我想要的并且可能会帮助你,但我没有测试从 TabBarController 调用。 【参考方案1】:
func safariViewControllerDidFinish(_ controller: SFSafariViewController) 
    //To access the  Specific tabBar ViewController
    let tabBarController = storyboard?.instantiateViewController(withIdentifier: "IdentifierTabbar") as! TabBar
   // tabBarController.isComingFrom = "Settings" // Assign the Value                
    window?.rootViewController = tabBarController

【讨论】:

不起作用,但没有崩溃,也没有控制台活动 添加这个 tabBarController.isComingFrom = "Settings"。 // 在 HomeTabBarViewController 类中分配要验证的值 我修改测试了【参考方案2】:

我遇到了同样的问题,当我在 SafariViewController 上点击“完成”时,我以编程方式解决了选择另一个标签栏项目的问题。在我的示例中,我选择标签栏的第一项。

import UIKit
import SafariServices
    
class WebViewController: UIViewController, SFSafariViewControllerDelegate 
        
    override func loadView() 

    
    override func viewDidLoad() 
        super.viewDidLoad()
        guard let url = URL(string: "<your website url>") else 
            return
        

        let safariVC = SFSafariViewController(url: url)
        present(safariVC, animated: true, completion: self.selectFirstTab())
        
    
    
    func selectFirstTab()
        self.tabBarController?.selectedIndex = 0
    


【讨论】:

以上是关于从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITabbarController 和 UINavigationController 从 storyboard 调用 View

UISplitview:从 appDelegate 访问 UITabBarController

viewWillAppear 在 4.3 中没有从 UITabBarController 启动,但在 5.0 中可以正常工作

在 UITabBarController 上添加 UIPickerView

presentingViewController 总是得到 UITabBarController

UITabbarController: 有啥方法可以切换 Tabbar 的 Tabbar Item(s)