iOS - [WKWebView .cxx_construct] должен использоваться только из основного потока - PullRequest
0 голосов
/ 12 октября 2018

Я новичок в разработке для iOS.

Я следовал этому руководству: https://www.ioscreator.com/tutorials/webview-ios-tutorial-ios11, чтобы создать приложение с веб-представлением.Это работало нормально, но внезапно прекратилось, и я понятия не имею, что отличается.

Теперь происходит сбой приложения, говоря: [WKWebView .cxx_construct] должен использоваться только из основного потока в этом коде (первая строка функции):

override func loadView() {
    viewerWebKit = WKWebView()
    viewerWebKit.navigationDelegate = self
    view = viewerWebKit
}

Что вызывает эту проблему?Почему раньше все работало нормально?И почему он вдруг перестал работать?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

hi Помните, что если вы хотите вносить изменения или создания пользовательского интерфейса, то это должно быть сделано только с использованием основного потока, в вашем случае вы упоминали, что изменения пользовательского интерфейса должны выполняться только основным потоком enter code here

override func loadView() {
  DispatchQueue.main.async {
    viewerWebKit = WKWebView()
    viewerWebKit.navigationDelegate = self
    view = viewerWebKit
  }
}
0 голосов
/ 12 октября 2018

@ ответ lokesh в правильном направлении, но неправильное решение.loadView() кажется вызванным в неосновном потоке.Этого никогда не должно случиться.Одной из причин будет то, что вы звоните loadView() вручную (что вам никогда не следует делать).Другая причина заключается в том, что вы ссылаетесь на view в фоновом потоке, чего вам никогда не следует делать.(Я подозреваю, что это именно то, что вы делаете.)

Установите точку останова в loadView до аварии.Запустите программу и убедитесь, что она находится в главном потоке.В вызове, где это не так, проследите назад туда, где вы его неправильно вызываете.Вы не должны разрешать это путем отправки в основную очередь в loadView, но вам, вероятно, потребуется добавить аналогичный вызов где-то еще.

0 голосов
/ 12 октября 2018

Вы должны иметь дело с пользовательским интерфейсом в MainThread .

dispatch_async(dispatch_get_main_queue(), {
 Some UI code here
})
...