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

为何UIScrollView内容视图中的WKWebView无法显示?

问题分析与解决方案

你遇到的问题核心在于错误地替换了IBOutlet关联的视图,而没有将WKWebView正确添加到已有的viewForWebview层级中,导致WebView没有正确布局,所以显示空白。

问题代码的关键错误

在loadView方法里,你直接执行了viewForWebview = webView——这会切断storyboard中viewForWebview原本的IBOutlet关联,把它替换成一个新的WKWebView实例,但这个新实例的frame是.zero,也没有被添加到任何父视图的层级结构里,自然无法显示。

修改后的正确代码

把WebView添加为viewForWebview的子视图,并通过AutoLayout约束让它填满整个父视图:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    var webView: WKWebView!
    @IBOutlet var viewForWebview: UIView!
    
    override func loadView() {
        super.loadView()
        let myConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: myConfiguration)
        webView.uiDelegate = self
        webView.navigationDelegate = self
        
        // 关键修改:将webView添加为viewForWebview的子视图
        webView.translatesAutoresizingMaskIntoConstraints = false
        viewForWebview.addSubview(webView)
        
        // 添加约束,让webView完全填满viewForWebview
        NSLayoutConstraint.activate([
            webView.topAnchor.constraint(equalTo: viewForWebview.topAnchor),
            webView.leadingAnchor.constraint(equalTo: viewForWebview.leadingAnchor),
            webView.trailingAnchor.constraint(equalTo: viewForWebview.trailingAnchor),
            webView.bottomAnchor.constraint(equalTo: viewForWebview.bottomAnchor)
        ])
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let url = URL(string: "https://www.google.com.au") else { return }
        let request = URLRequest(url: url)
        webView.load(request)
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Finished navigating to url \(String(describing: webView.url))")
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        print(error)
    }
}

为什么直接放在UIScrollView内容视图里能正常显示?

当你直接把WKWebView放在UIScrollView的内容视图中时,storyboard已经帮你设置好了WebView的布局约束(或frame),并且它已经存在于视图层级里,所以能正常渲染和显示内容。

额外注意事项

  • 确保viewForWebview在storyboard中确实关联到了UIScrollView内容视图的子视图上,没有关联错误。
  • 设置webView.translatesAutoresizingMaskIntoConstraints = false是为了禁用自动生成的约束,避免和我们手动添加的AutoLayout约束冲突。

内容的提问来源于stack exchange,提问作者cmii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:46