【问题标题】:Simple Webview: navigationDelegate crashes on start简单的 Webview:navigationDelegate 在启动时崩溃
【发布时间】:2016-11-24 10:32:11
【问题描述】:

我的 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”。

另外,通过查看我的代码...您是否看到关于使用我的 webview 需要更改的任何内容?

谢谢你帮助我。

【问题讨论】:

  • “WKWebView!我需要这个吗?”:是的
  • @shallowThought 所以我重新绑定了创建 IBOutlet 的情节提要,但问题总是一样
  • 我怀疑你确实将它绑定到不是 WKWebView 的东西。
  • @Infact 当我拖动 webview 时,它会创建绑定但作为 UIWebView,然后我手动将其更改为 WkWebView ...如何将其绑定为 WkWebView?

标签: ios webview swift3 appdelegate wkwebview


【解决方案1】:

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

希望对您有所帮助!

【讨论】:

    【解决方案2】:

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

    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
    }
    

    【讨论】:

    • 感谢您尝试帮助我,但不幸的是这不起作用。我尝试打开一个全新的项目,只是按照你说的做,但没有运气......看:imgur.com/a/eZTSJ
    • 以编程方式您的意思是我只需将代码写入 ViewController 而不在 Storyboard 中创建视图然后绑定它?仅放置此代码就足够了吗?因为现在我为测试它而创建的裸应用程序可以工作,但它没有向我展示任何东西。干杯哥们
    • 你的意思是我还必须创建一个新的 .swift 文件链接到这个新的 MyViewController?或者你的意思是把这个 MyViewController 链接到实际的 ViewController.swift?
    • 点击此链接可找到示例项目的下载链接:chat.stackoverflow.com/rooms/128967/…
    【解决方案3】:

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

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

    【讨论】:

    • 我绑定了创建 IBOutlet 的情节提要,但问题总是一样...
    【解决方案4】:

    我收到错误 Value of type '(WKWebView, WKNavigation?) -> ()' has no member 'navigationDelegate'(我猜这与添加 webView.navigationDelegate = self 时导致崩溃的问题相同)。

    我发现视图控制器类需要通过将WKNavigationDelegate 协议添加到类定义中来实现WKNavigationDelegate 协议(有点像继承),这为我解决了错误。确保在此代码的第一行中包含它:

    class ViewController: UIViewController, WKNavigationDelegate {
      // ...
    
      override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
      }
    
      func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
         // ...
      }      
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多