在Swift 4中创建WKPreferences变量时如何修复“ EXC_BAD_ACCESS”

Mat*_*ris 4 swift wkwebview wkwebviewconfiguration

在我的代码中,我有一个部分可以创建一个WKWebView带有特定的新内容,而该特定WKWebViewConfiguration内容又具有WKPreferences引用。然后将所有这些添加到应用程序的视图中。

问题在于,到目前为止,我的代码一直运行良好,没有任何问题。

现在,出于某种奇怪的原因,当我启动该应用程序时,

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffeec686fc0)

当我为创建一个变量时在线上WKPreferences

我正在使用Xcode 10.1Swift 4和,并且已安装AlamofireNetworkReachability吊舱。我试过只创建WKWebView不带的WKPreferences,但错误仅移至WKWebViewConfiguration

func createWebView() {
    let preferences = WKPreferences()   //<-- EXC_BAD_ACCESS
    preferences.javaScriptEnabled = true
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences = preferences
    webConfiguration.allowsInlineMediaPlayback = true
    webViewVar = WKWebView(frame: self.view.bounds, configuration: webConfiguration)
    webViewVar.uiDelegate = self
    self.view = webViewVar
}

override func loadView() {
    createWebView()
}
Run Code Online (Sandbox Code Playgroud)

预期的行为是该应用程序将启动并显示代码中其他地方指定的不变的网页。实际结果是该应用程序EXC_BAD_ACCESS在启动时崩溃并显示错误。

mat*_*att 5

我不得不说你发现了一个错误。由于某些原因,运行时不允许您在应用程序的早期阶段创建WKPreferences对象。

解决方法是,必须推迟创建Web视图,直到应用程序启动并运行。为此,请改为删除loadView并实现viewDidLoad,然后在那里进行所有工作,使Web视图成为主视图的子视图,而不是尝试使其成为主视图。

var webViewVar : WKWebView!
func createWebView() {
    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences = preferences
    webConfiguration.allowsInlineMediaPlayback = true
    webViewVar = WKWebView(frame: self.view.bounds, configuration: webConfiguration)
    webViewVar.uiDelegate = self
    self.view.addSubview(webViewVar)
    webViewVar.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
override func viewDidLoad() {
    super.viewDidLoad()
    createWebView()
}
Run Code Online (Sandbox Code Playgroud)

这很烦人,您应该向Apple提交错误报告,但这至少可以使您立即前进。