You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WKWebView加载成功后不显示内容,仅出现黑屏问题求助

WKWebView加载成功但无页面内容的问题解决

你的代码里有两个关键问题导致看不到页面内容:

  • 创建了WKWebView实例,但没有将它添加到视图控制器的view层级中,所以加载完成后页面无法显示在屏幕上
  • 初始化WKWebView时用了frame: .zero,就算添加了视图,也会因为尺寸为0而看不到

修改方案:

  1. 重写loadView时,直接将WKWebView设置为控制器的view,或者添加到view后设置约束让它铺满屏幕
  2. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:35:17