Простой веб-просмотр: NavigationDelegate вылетает при запуске

У меня небольшая проблема с моим WebView. Вот что я делаю в своем приложении:

import UIKit
import WebKit

class ViewController: UIViewController,  WKNavigationDelegate  {

@IBOutlet var webView: WKWebView! // draged from storyboard

override func viewDidLoad() {
    super.viewDidLoad()

    var urlToLoad : (String)
    urlToLoad = "http://wwww.myapp.com"

    webView.sizeToFit()
    webView.isUserInteractionEnabled = true

    let url = URL(string: urlToLoad)
    let request = URLRequest(url:url!)
    //webView.navigationDelegate = self
    webView.load(request)
}

Как видите, строка «webView.navigationDelegate = self» закомментирована. Если я раскомментирую это, мое приложение вылетит при запуске и сообщит мне следующее:

Отладчик: libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException

введите здесь описание изображения

Есть идеи, почему это происходит и как это решить? Мне это нужно, чтобы использовать такие методы, как «didFinish navigation», которые я уже реализовал на странице, но они никогда не вызываются.

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

Спасибо за помощь мне.


person ernestocattaneo    schedule 24.11.2016    source источник
comment
WKWebView! мне это нужно ?: Да   -  person shallowThought    schedule 24.11.2016
comment
@shallow подумал, что я перекомпоновал раскадровку, создав IBOutlet, но проблема всегда одна и та же   -  person ernestocattaneo    schedule 24.11.2016
comment
Я подозреваю, что вы связали его с чем-то, кроме WKWebView.   -  person shallowThought    schedule 24.11.2016
comment
@Infact, когда я перетаскиваю веб-просмотр, он создает привязку, но как UIWebView, а затем я вручную изменил его на WkWebView ... как я могу привязать его как WkWebView?   -  person ernestocattaneo    schedule 24.11.2016


Ответы (4)


Вы используете UIWebView и пытаетесь вызвать методы WKWebView, что приводит к сбою вашего приложения из-за отправки нераспознанного селектора в UIWebView.

Попробуйте создать новый проект и использовать указанный ниже код.

импортировать фреймворк "WebKit" в свой класс.

override func viewDidLoad() {
 super.viewDidLoad()
 let myWebView:WKWebView = WKWebView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
 myWebView.navigationDelegate = self;
 let url = URL(string: "https://www.Apple.com")!
 myWebView.load(URLRequest(url: url))
 self.view.addSubview(myWebView)
}

затем реализуйте метод WKNavigationDelegate

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
let url = webView.url
print(url as Any) // this will print url address as option field
if url?.absoluteString.range(of: ".pdf") != nil {
     pdfBackButton.isHidden = false
     print("PDF contain")
   }
else {
     pdfBackButton.isHidden = true
     print("No PDF Contain")        
   } 
}

Надеюсь, что это поможет вам!

person Mangesh Kondaskar    schedule 28.11.2016

Вы привязываете UIWebView к свойству типа WKWebView. В результате он вылетает при попытке вызвать navigationDelegate на UIWebView, поскольку он не предлагает этот метод.

В раскадровке нет доступной версии шаблона WKWebView, поэтому вам нужно создать WKWebView программно:

import UIKit
import WebKit

class ViewController: UIViewController,  WKNavigationDelegate  {

var webView: WKWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    webView = WKWebView(frame: view.frame)
    webView.navigationDelegate = self
    view.addSubview(webView)

    let url = URL(string: "https://www.google.com")!
    webView.load(URLRequest(url: url))
    webView.allowsBackForwardNavigationGestures = true
}
person shallowThought    schedule 24.11.2016
comment
спасибо за попытку помочь мне, но, к сожалению, это не сработает. Я попробовал открыть новый проект и просто сделать то, что вы сказали, но безуспешно ... посмотрите: imgur.com/ a / eZTSJ - person ernestocattaneo; 24.11.2016
comment
программно вы имеете в виду, что мне нужно только написать код в ViewController, не создавая View в Storyboard, а затем ограничивая его? Достаточно ли просто поставить этот код? Потому что теперь голое приложение, которое я создал для проверки, работает, но ничего мне не показывает. Ура приятель - person ernestocattaneo; 24.11.2016
comment
Вы имеете в виду, что мне также нужно создать новый файл .swift, связанный с этим новым MyViewController? Или вы имеете в виду привязку этого MyViewController к фактическому ViewController.swift? - person ernestocattaneo; 24.11.2016
comment
Щелкните эту ссылку, чтобы найти ссылку для загрузки примера проекта: chat.stackoverflow.com/rooms/128967 / - person shallowThought; 24.11.2016

Вы не инициализируете webView. Приложение вылетает, потому что это nil.

Вам нужно привязать его к раскадровке или xib-файлу (раскомментировать @IBOutlet) или инициализировать его программно, а затем добавить к себе viewController's view.

person Max Pevsner    schedule 24.11.2016
comment
Я связал раскадровку, создав IBOutlet, но проблема всегда одна и та же ... - person ernestocattaneo; 24.11.2016

Я получал ошибку Value of type '(WKWebView, WKNavigation?) -> ()' has no member 'navigationDelegate' (я предполагаю, что это та же проблема, что и причина сбоя при добавлении webView.navigationDelegate = self).

Я обнаружил, что класс контроллера представления должен реализовать протокол WKNavigationDelegate (вроде наследования), добавив его в определение класса, что исправило ошибку для меня. Убедитесь, что это так, как в первой строке этого кода:

class ViewController: UIViewController, WKNavigationDelegate {
  // ...

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

  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
     // ...
  }      
}
person kmanzana    schedule 25.06.2020