从 SafariWebController 返回时的 Swift 白屏

Posted

技术标签:

【中文标题】从 SafariWebController 返回时的 Swift 白屏【英文标题】:Swift White Screen upon returning from SafariWebController 【发布时间】:2019-12-09 10:39:51 【问题描述】:

当我打开一个 safari 视图控制器然后返回到我的应用程序时(当按下“完成”时),我的应用程序呈现一个空白/白色屏幕而不是该视图的内容。

下面的代码是我尝试在空视图中使用的代码 - 无论我在应用程序的哪个位置尝试,都会出现问题。

import UIKit
import SafariServices

class SavedViewController: UIViewController, SFSafariViewControllerDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        if let link = URL(string: "https://google.com")
            let myrequest = SFSafariViewController(url: link)
            myrequest.delegate = self
            present(myrequest, animated:true)
        
    

    func safariViewControllerDidFinish(_ controller: SFSafariViewController) 
        dismiss(animated:true, completion: nil)
    


网站加载正常,当我返回我的应用程序时出现空白屏幕。我是不是做错了什么?

【问题讨论】:

【参考方案1】:

它工作正常。 您刚刚以这种方式创建了新的 UIViewController,默认情况下 UIViewController 具有黑色背景。因此,当您按下 Done 时,您只是从 SafariViewController 回到 SavedViewController (UIViewController)。 可能您正在寻找 UIWebView 解决方案https://developer.apple.com/documentation/uikit/uiwebview。 如果您只想显示 SafariViewController,请将其作为 ViewController 的功能,您无需使用 UIViewController 类创建新文件即可。

import UIKit
import SafariServices

class SavedViewController: UIViewController, SFSafariViewControllerDelegate 

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    view.backgroundColor = .gray
    setupViews()


func safariViewControllerDidFinish(_ controller: SFSafariViewController) 
    dismiss(animated:true, completion: nil)


private func setupViews()
    view.addSubview(openSafariButton)
    openSafariButton.addTarget(self, action: #selector(handleOpenSafariButtonTap), for: .touchUpInside)
    openSafariButton.frame = CGRect(x: 0, y: 100, width: view.frame.width, height: 60)


@objc func handleOpenSafariButtonTap()
    if let link = URL(string: "https://google.com")
        let myrequest = SFSafariViewController(url: link)
        myrequest.delegate = self
        present(myrequest, animated:true)
    


let openSafariButton: UIButton = 
    let button = UIButton()
    button.setTitle("openSafari", for: .normal)
    button.setTitleColor(.black, for: .normal)
    button.backgroundColor = .red
    return button
()


这就是我的意思。

您可以添加功能:

    private func openSafariLink(link: String)
    if let link = URL(string: link)
        let myrequest = SFSafariViewController(url: link)
        present(myrequest, animated:true)
    

然后从任何这样的地方调用它:

openSafariLink(link: "https://google.com")

这种方式更适合您的解决方案。

【讨论】:

我没有提到黑色背景 - 我看到的是白色。我的 UIViewController 中有内容,为什么不显示?我需要“完成”功能,因为我的应用程序打开了外部链接,但它应该能够直接返回到应用程序中——SafariViewController 默认允许这样做,那么我为什么要重新发明***呢?另外,您链接的内容已被弃用。 您提供源代码。因为它是新的 ViewController,所以在 ViewDidLoad 上打开 SafariViewController。我的意思是您应该将代码作为函数调用,而不是打开新的 ViewController 并从 ViewDidLoad 调用它 你我知道 UIWebView 已被弃用,我只是提供它作为一种解决方案,所以你可以让我们知道你在寻找什么。 (你看到白色背景,因为你可能是通过故事板添加的) 如果我想在 tableviewcontroller 中使用它,这种行为是否仍能按预期工作,还是需要将它们彼此分开? 它应该可以正常工作。你可以在 button tap 或 didselect tableView 方法上使用它,我将提供一些额外的代码,所以在答案中,它会更简单。

以上是关于从 SafariWebController 返回时的 Swift 白屏的主要内容,如果未能解决你的问题,请参考以下文章

当用户使用返回键从任何其他页面返回页面时如何刷新页面?

VBA出错时如何从函数返回

从后台返回时iOS应用程序请求失败

存储过程在 SSMS 中执行时都返回结果,但从代码执行时只有一个返回结果

如何调试从后台返回时发生的崩溃

从后台返回时隐藏音量 HUD