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

Posted

技术标签:

【中文标题】简单的 Webview:navigationDelegate 在启动时崩溃【英文标题】:Simple Webview: navigationDelegate crashes on start 【发布时间】: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? 【参考方案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.***.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!) 
     // ...
        

【讨论】:

以上是关于简单的 Webview:navigationDelegate 在启动时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

[C#][原创]webview2简单使用

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

Unity WebView 插件⭐️3D WebView 插件 工程文件夹 简单分析

flutter_webview_plugin 加载全屏页面的简单使用

WebView.简单使用

简单的 webview 示例代码 Android studio