为什么 WKWebView 变成了 nil?

Why WKWebView becomes nil?

我用的是Swift4.0和Xcode9.0。我尝试使用 WKWebView 显示网站。昨天还没有问题,今天就出错了

import UIKit
import WebKit

class WKWebViewViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!

    var startUrl = "https://www.apple.com"
    var requestUrl: String?

    override func loadView() {
        webView.uiDelegate = self
        webView.navigationDelegate = self

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.allowsBackForwardNavigationGestures = true

        if let url = URL(string: startUrl) {
            let request = URLRequest(url: url)
            webView.load(request)

        }

    }

}

错误发生在webView.uiDelegate = self。这是错误日志:

fatal error: unexpectedly found nil while unwrapping an Optional value

为了调试,我在loadView()下添加了print("webView:\(webView)"),发现webView本身就是nil

我尝试将 ? 添加到所有 webView,但应用程序仅出现黑屏。 为什么 WkWebView 变成了 nil?是我的代码之外的一些必需设置吗?

您在错误的方法中设置委托 loadView()。 ViewController 在需要其视图 属性 时调用此方法,此时所有 IBOutlets 仍为零。

您应该将您的代码移动到您确定 IBOutlets 已设置为 viewDidLoad 或更好的 didSet 的 IBOutlet 属性

@IBOutlet weak var webView: WKWebView! {
  didSet {
      webView.uiDelegate = self
      webView.navigationDelegate = self
  }
}

当您以这种方式覆盖 loadView 时,您 必须 调用 super.loadView()。这就是 WKWebView 为零的原因。

文档建议在使用 storyboard/xib

时根本不要覆盖 loadView

If you use Interface Builder to create your views and initialize the view controller, you must not override this method.

您应该将这两行代码作为 viewDidLoad

中的第二件事
override func viewDidLoad() {
    super.viewDidLoad()
    webView.uiDelegate = self
    webView.navigationDelegate = self
    ....
}