为什么 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
....
}
我用的是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
....
}