gpt4 book ai didi

ios - 如何在推送其 View Controller 之前预加载 WKWebView?

转载 作者:可可西里 更新时间:2023-11-01 01:07:51 27 4
gpt4 key购买 nike

我问这个问题是因为经过一些研究,我没有在网上找到满意的答案。

我的需求很简单,我有一个 UITableViewController,当我点击一个单元格时,我需要显示一个加载程序(同时加载 WKWebViewContent),然后推送下一个 UIViewController,其中已经加载了 WKWebView。

我试过这个:

class TableViewController: UITableViewController, WKNavigationDelegate {

var webviewToLoad:WKWebView!

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let htmlString = "some html content"


webviewToLoad = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
webviewToLoad.navigationDelegate = self
webviewToLoad.loadHTMLString(htmlString, baseURL: Bundle.main.resourceURL)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

if segue.identifier == "postview"{
let destinationController = segue.destination as! ViewController
destinationController.webView= webviewToLoad
}
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Loaded!")
self.performSegue(withIdentifier: "postview", sender: self)
}

}

class ViewController: UIViewController, WKUIDelegate {

var webView: WKWebView!

override func loadView() {

let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
self.view = webView
}

override func viewDidLoad() {
super.viewDidLoad()
}
}

didFinish 被调用,但最终的 WKWebView 是空白的。

也许这不是正确的方法,有什么想法吗?

最佳答案

didFinish is called, but the final WKWebView is blank

因为您从未做过任何事情让它不是空白。你的代码说:

var webviewToLoad:WKWebView!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
webviewToLoad = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
webviewToLoad.navigationDelegate = self
webviewToLoad.loadHTMLString(htmlString, baseURL: Bundle.main.resourceURL)
}

所以你所做的一切都是关于webviewToLoad。但是 webviewToLoad 不是在 segue 之后出现在 ViewController 中的 webView:

class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
}

是您要向其提供内容的 WebView 。你根本没有这样做;您的代码都没有触及 webView 来为其提供内容。

我认为你困惑的核心在这里:

if segue.identifier == "postview"{
let destinationController = segue.destination as! ViewController
destinationController.webView = webviewToLoad
}

您不能仅仅用一种 WebView 替换另一种 WebView 并期望事情神奇地工作; loadView 仍会导致原始的空白 Web View 成为您的 View 并出现在界面中。

相反,您想要的是这种架构:

if segue.identifier == "postview"{
let destinationController = segue.destination as! ViewController
// make `loadView` run
destinationController.loadViewIfNeeded()
let webView = destinationController.webView
// now load _this_ `webView` with content!
let htmlString = "some html content"
webView.loadHTMLString(htmlString, baseURL: Bundle.main.resourceURL)
}

关于ios - 如何在推送其 View Controller 之前预加载 WKWebView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54009892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com