【问题标题】:Why WKWebView becomes nil?为什么 WKWebView 变为 nil?
【发布时间】:2017-10-31 10:59:55
【问题描述】:

我使用 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?这是我的代码之外的一些必需设置吗?

【问题讨论】:

    标签: swift xcode wkwebview


    【解决方案1】:

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

    文档建议在使用故事板/xib 时根本不要覆盖 loadView

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

    您应该将这两行代码作为viewDidLoad 中的第二件事移动

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.uiDelegate = self
        webView.navigationDelegate = self
        ....
    }
    

    【讨论】:

    • 谢谢!现在WKWebView 工作!我完全忘记了super.loadview()
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多