简单的 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 在启动时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
简单的 Webview:navigationDelegate 在启动时崩溃
Unity WebView 插件⭐️3D WebView 插件 工程文件夹 简单分析