为何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
相关产品推荐
相关产品推荐

