简单的Webview:navigationDelegate在启动时崩溃

时间:2016-11-24 10:32:11

标签: ios webview swift3 appdelegate wkwebview

我的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类型的未捕获异常终止

enter image description here

知道为什么会发生这种情况以及如何解决这个问题?我需要这个才能使用" didFinish navigation"等方法。我已经在页面中实现了但它们从未被调用过。

另外,通过查看我的代码......您会看到我应该更改有关使用我的网页视图的任何内容吗?

感谢您帮助我。

4 个答案:

答案 0 :(得分:2)

您正在使用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")        
   } 
}

希望这会对你有帮助!

答案 1 :(得分:1)

您正在将UIWebView绑定到WKWebView类型的属性。因此,当尝试在navigationDelegate上调用UIWebView时,它会崩溃,因为它不提供此方法。

Storyboard中没有可用的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
}

答案 2 :(得分:0)

您没有初始化webView。该应用程序崩溃,因为它是nil

您需要将其绑定到storyboard或xib文件(取消注释@IBOutlet)或以编程方式对其进行初始化,然后将其添加到viewController's view

答案 3 :(得分:0)

我收到错误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!) {
     // ...
  }      
}