Swift 从UIWebView迁移到WKWebView(导航操作的决策策略)未按预期工作
我需要重构代码以开始使用WKWebView,正如Apple建议的那样,我从UIWebView切换到WKWebView。我的问题是,当应用程序执行时,我的代码的一部分没有被触发,我似乎无法指出我做错了什么这是我需要替换的代码Swift 从UIWebView迁移到WKWebView(导航操作的决策策略)未按预期工作,swift,webview,uiwebview,wkwebview,Swift,Webview,Uiwebview,Wkwebview,我需要重构代码以开始使用WKWebView,正如Apple建议的那样,我从UIWebView切换到WKWebView。我的问题是,当应用程序执行时,我的代码的一部分没有被触发,我似乎无法指出我做错了什么这是我需要替换的代码 class Webview: UIWebView, UIWebViewDelegate, UIGestureRecognizerDelegate, MFMailComposeViewControllerDelegate { var initialViewController
class Webview: UIWebView, UIWebViewDelegate, UIGestureRecognizerDelegate, MFMailComposeViewControllerDelegate {
var initialViewController: LinkViewControllerType?
var isLoadingHTMLString:Bool = true
var scrollViewDidScroll: ((_ scrollView: UIScrollView) -> ())?
var scrollViewDidEndDecelerating: ((_ scrollView: UIScrollView) -> ())?
var scrollViewDidEndDragging: ((_ scrollView: UIScrollView,_ willDecelerate: Bool) -> ())?
var scrollViewWillEndDragging: ((_ scrollView: UIScrollView,_ withVelocity: CGPoint,_ targetContentOffset: UnsafeMutablePointer<CGPoint>) -> ())?
var shouldStartLoadWith: ((_ webview: UIWebView,_ request: URLRequest, _ navigationType: UIWebView.NavigationType) -> Bool)?
var webViewDidFinishLoad: ((_ webView: UIWebView) -> ())?
var tapGestureRecogniser:UITapGestureRecognizer?
func configure(from: LinkViewControllerType) {
self.initialViewController = from
self.delegate = self
self.scrollView.delegate = self
if (self.tapGestureRecogniser == nil) {
let recog = UITapGestureRecognizer.init(target: self, action: #selector(doubleTap(_:)))
recog.delegate = self
self.addGestureRecognizer(recog)
self.tapGestureRecogniser = recog
}
}
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
return shouldStartLoadWith?(webView, request, navigationType) ?? true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
@objc func doubleTap(_ gestureRecogniser: UITapGestureRecognizer) {
let touchPoint = gestureRecogniser.location(in: self) as CGPoint
let imageSrc = String(format: "document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y)
if let srcOfImage = self.stringByEvaluatingJavaScript(from: imageSrc) {
if (srcOfImage.contains("http://") || srcOfImage.contains("https://")) {
self.openImageView(httpUrl: srcOfImage)
}
}
}
private func openImageView(fileUrl:URL? = nil, httpUrl:String? = nil) {
let viewController = ViewControllerManager.Initializers.GuidelineImageViewController()
if let fileUrl = fileUrl {
if let imageData = try? Data(contentsOf: fileUrl) {
viewController.image = UIImage(data: imageData)
}
} else {
viewController.httpUrl = httpUrl
}
self.initialViewController?.navigationController?.pushViewController(viewController, animated: true)
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
if let initialViewController = self.initialViewController {
initialViewController.dismiss(animated: true, completion: nil)
}
}
func webViewDidFinishLoad(_ webView: UIWebView) {
webViewDidFinishLoad?(webView)
let when = DispatchTime.now() + 0.05
DispatchQueue.main.asyncAfter(deadline: when) {
self.alpha = 1
}
}
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
super.scrollViewDidScroll(scrollView)
scrollViewDidScroll?(scrollView)
}
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
scrollViewDidEndDecelerating?(scrollView)
}
override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
scrollViewDidEndDragging?(scrollView,decelerate)
}
override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint,
targetContentOffset: UnsafeMutablePointer<CGPoint>) {
scrollViewWillEndDragging?(scrollView, velocity, targetContentOffset)
}}
在UIWebView上,它没有问题。它毫无问题地工作。非常感谢您的帮助。尽管委托是在
configure
方法中定义的,但如何调用它。我在许多地方/viewControllers中重用了这个类,并且在viewDidLoad()上像这样调用配置“(webView.configure(from:self)))有趣的是,您正在将webview本身设置为其导航委托。在上述场景中,您的from
应该是委托的,并让控制器决定是否允许。虽然委托是在configure
方法中定义的,但如何调用它。我在许多地方/viewControllers重用这个类,配置的调用方式如下“(webView.configure(from:self))”在调用itIt的viewController的viewDidLoad()上,有趣的是您正在将webview本身设置为其导航委托。在上述场景中,您的来自的应该被委派,并让控制器做出允许或不允许的决定。
class Wkwebview: WKWebView, WKNavigationDelegate, UIGestureRecognizerDelegate, UIScrollViewDelegate, MFMailComposeViewControllerDelegate{
var initialViewController: LinkViewControllerType?
var isLoadingHTMLString:Bool = false
var scrollViewDidScroll: ((_ scrollView: UIScrollView) -> ())?
var scrollViewDidEndDecelerating: ((_ scrollView: UIScrollView) -> ())?
var scrollViewDidEndDragging: ((_ scrollView: UIScrollView,_ willDecelerate: Bool) -> ())?
var scrollViewWillEndDragging: ((_ scrollView: UIScrollView,_ withVelocity: CGPoint,_ targetContentOffset: UnsafeMutablePointer<CGPoint>) -> ())?
var decidePolicyFor: ((_ webview: WKWebView,_ request: WKNavigationAction) -> Bool)?
var viewDidLoad: ((_ webView: WKWebView) -> ())?
var tapGestureRecogniser:UITapGestureRecognizer?
func configure(from: LinkViewControllerType) {
self.initialViewController = from
self.navigationDelegate = self
self.scrollView.delegate = self
if (self.tapGestureRecogniser == nil) {
let recog = UITapGestureRecognizer.init(target: self, action: #selector(doubleTap(_:)))
recog.delegate = self
self.addGestureRecognizer(recog)
self.tapGestureRecogniser = recog
}
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) -> Bool {
return decidePolicyFor?(webView,navigationAction) ?? true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
@objc func doubleTap(_ gestureRecogniser: UITapGestureRecognizer) {
let touchPoint = gestureRecogniser.location(in: self) as CGPoint
let imageSrc = String(format: "document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y)
var srcOfImage = ""
self.evaluateJavaScript(imageSrc, completionHandler: { (result: Any?, error: Error?) in
if(error == nil){
if(result != nil){
srcOfImage = result as! String
if (!srcOfImage.isEmptyOrWhitespace()) {
if (srcOfImage.contains("http://") || srcOfImage.contains("https://")) {
self.openImageView(httpUrl: srcOfImage)
}
}
}
}
})
}
private func openImageView(fileUrl:URL? = nil, httpUrl:String? = nil) {
let viewController = ViewControllerManager.Initializers.GuidelineImageViewController()
if let fileUrl = fileUrl {
if let imageData = try? Data(contentsOf: fileUrl) {
viewController.image = UIImage(data: imageData)
}
} else {
viewController.httpUrl = httpUrl
}
self.initialViewController?.navigationController?.pushViewController(viewController, animated: true)
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
if let initialViewController = self.initialViewController {
initialViewController.dismiss(animated: true, completion: nil)
}
}
func viewDidLoad(_ webView: WKWebView) {
viewDidLoad(webView)
let when = DispatchTime.now() + 0.05
DispatchQueue.main.asyncAfter(deadline: when) {
self.alpha = 1
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollViewDidScroll?(scrollView)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
scrollViewDidEndDecelerating?(scrollView)
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
scrollViewDidEndDragging?(scrollView,decelerate)
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint,
targetContentOffset: UnsafeMutablePointer<CGPoint>) {
scrollViewWillEndDragging?(scrollView, velocity, targetContentOffset)
}}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) -> Bool {
return decidePolicyFor?(webView,navigationAction) ?? true
}