从第一个 VC 预加载 WKWebView url

Preload WKWebView url from first VC

我正在尝试在第二个 VC 为 called/presented 之前预加载 WKWebView。

这可以在 swift5 编程语言中完成吗?也许调用 layoutSubviews()?

是否可以在转换到下一个视图控制器之前预加载 webView?或者是显示正在加载的唯一方法是通过 activity 指标?

第一个VC:

override func viewDidLoad() {
        super.viewDidLoad()
        SecondVC.loadWebView() //PSUEDO of what I am trying to do
        
    }

第二VC:

func loadWebView() {
        
        // WKWebView nit
        webView.navigationDelegate = self
        webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
        view.addSubview(webView)
        view.backgroundColor = .systemBackground
     
        guard let url = URL(string: "https://connect.stripe.com/oauth/authorize?response_type=code&client_id=\(live_client_id)&scope=read_write") else {
            return
        }
        
        
        webView.load(URLRequest(url: url))
        
    }

假设这是您拥有 Web 视图的视图控制器。您可以将加载网页的代码放在其初始化程序中。

class WebViewController: UIViewController {
    lazy private var webView: WKWebView = {
        let webView = WKWebView(frame: view.bounds)
        return webView
    }()
    
    private var url: URL!
    
    init(url: URL) {
        self.url = url
        super.init(nibName: nil, bundle: nil)
        
        self.loadWebsite()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    
    private func loadWebsite() {
        view.addSubview(webView)
        webView.load(URLRequest(url: url))
    }
}

在之前的视图控制器中,您在导航到 Web 视图之前实例化 WebViewController。当您实例化它时,将调用 WebViewController 的初始化程序,然后调用 loadWebsite() 加载网页的方法。

class ViewController: UIViewController {
    let vc = WebViewController(url: URL(string: "https://stripe.com/")!)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.showWebView()
        }
    }
    
    private func showWebView() {
        navigationController?.show(vc, sender: nil)
    }
}

因此,当您实际显示 WebViewController 时,希望网页已经加载。