WKWebView加载成功后不显示内容,仅出现黑屏问题求助
WKWebView加载成功但无页面内容的问题解决
你的代码里有两个关键问题导致看不到页面内容:
- 创建了WKWebView实例,但没有将它添加到视图控制器的view层级中,所以加载完成后页面无法显示在屏幕上
- 初始化WKWebView时用了
frame: .zero,就算添加了视图,也会因为尺寸为0而看不到
修改方案:
- 重写
loadView时,直接将WKWebView设置为控制器的view,或者添加到view后设置约束让它铺满屏幕 - 自定义
loadView时不需要调用super.loadView(),否则会生成默认的空白view,你的webView无法替换或覆盖它
修改后的完整代码:
import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { // WebView实例 var webViewObj: WKWebView! var webNav: WKNavigation! // 数据库相关 let db = DBHelper() var list = [DBGrade]() override func loadView() { let webConfiguration = WKWebViewConfiguration() // 初始化时设置frame为屏幕尺寸,直接铺满屏幕 webViewObj = WKWebView(frame: UIScreen.main.bounds, configuration: webConfiguration) // 将webView设为控制器的view self.view = webViewObj } override func viewDidLoad() { super.viewDidLoad() guard let url = URL(string: "https://www.hackingwithswift.com") else { return } let request = URLRequest(url: url) webViewObj.navigationDelegate = self webViewObj.uiDelegate = self webViewObj.load(request) } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("loaded") } func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame == nil { webView.load(navigationAction.request) } return nil } func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let hostStr = navigationAction.request.url?.absoluteString else { decisionHandler(.cancel) return } if hostStr.contains("hackingwithswift.com") { decisionHandler(.allow) print("did it") } else { decisionHandler(.cancel) } } }
备选方案(不替换控制器view,添加子视图)
如果不想替换控制器的默认view,也可以保留super.loadView(),然后把webView添加到view上并设置自动布局约束:
override func loadView() { super.loadView() let webConfiguration = WKWebViewConfiguration() webViewObj = WKWebView(frame: .zero, configuration: webConfiguration) webViewObj.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(webViewObj) // 设置约束让webView铺满整个父view NSLayoutConstraint.activate([ webViewObj.topAnchor.constraint(equalTo: self.view.topAnchor), webViewObj.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), webViewObj.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), webViewObj.bottomAnchor.constraint(equalTo: self.view.bottomAnchor) ]) }
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

