Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从UIWebView迁移到WKWebView(导航操作的决策策略)未按预期工作_Swift_Webview_Uiwebview_Wkwebview - Fatal编程技术网

Swift 从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

我需要重构代码以开始使用WKWebView,正如Apple建议的那样,我从UIWebView切换到WKWebView。我的问题是,当应用程序执行时,我的代码的一部分没有被触发,我似乎无法指出我做错了什么这是我需要替换的代码

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
}