Как исправить «EXC_BAD_ACCESS» при создании переменной WKPreferences в Swift 4 - PullRequest
0 голосов
/ 27 декабря 2018

В моем коде есть деталь, которая создает новый WKWebView с конкретным WKWebViewConfiguration, который, в свою очередь, имеет ссылку WKPreferences.Все это затем добавляется в представление приложения.

Проблема в том, что до этого момента мой код работал без проблем.

Теперь, по какой-то странной причине, когда я запускаю приложение, я получаю

Поток 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7ffeec686fc0)

в строке, когда я создаю переменную для WKPreferences.

Я работаю с Xcode 10.1, Swift 4, и у меня установлены Alamofire и NetworkReachability модули.Я попытался просто создать 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()
}

Ожидаемое поведение - приложение запускается и показывает вебстраница, которая не изменяется, указана в другом месте кода.Фактический результат - приложение вылетает с ошибкой EXC_BAD_ACCESS при запуске.

1 Ответ

0 голосов
/ 27 декабря 2018

Я бы сказал, что вы нашли ошибку.По какой-то причине среда выполнения не позволяет вам создавать объект WKPreferences на столь раннем этапе существования приложения.

Обходной путь заключается в том, что вам придется отложить создание веб-представления до запуска и запуска приложения.Для этого удалите loadView и внедрите вместо него viewDidLoad и выполните всю работу там, превратив веб-представление в подпредставление основного представления, вместо того, чтобы пытаться сделать его be * 1008.* основной вид.

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()
}

Это раздражает, и вы должны подать отчет об ошибке в Apple, но, по крайней мере, это сохранит вас на данный момент.

...