我使用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
变成零?是否需要在我的代码之外进行设置?
答案 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
....
}