为什么WKWebView变为零?

时间:2017-10-31 10:59:55

标签: swift xcode wkwebview

我使用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

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

我尝试将?添加到所有webView,但应用中只显示黑屏。 为什么WkWebView变成零?是否需要在我的代码之外进行设置?

2 个答案:

答案 0 :(得分:2)

您正在使用错误的方法loadView()设置委托。 ViewController在需要view属性时调用此方法,此时所有IBOutlet仍为零。

您应该将代码移动到您确定已在viewDidLoad或更好地设置IBOutlet属性didSet时设置IBOutlet的位置

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

答案 1 :(得分:0)

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

使用storyboard / xib时,文档建议不要覆盖loadView

  

如果使用Interface Builder创建视图并初始化视图控制器,则不得覆盖此方法。

您应该将这两行代码移动到viewDidLoad

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