在我的应用程序中,我正在从UIWebView迁移到WKWebView,我如何为WKWebView重写这些函数?

    func webViewDidStartLoad(webView: UIWebView){}
    func webViewDidFinishLoad(webView: UIWebView){}

    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        print("webview asking for permission to start loading")
        if navigationType == .LinkActivated && !(request.URL?.absoluteString.hasPrefix("http://www.myWebSite.com/exemlpe"))!{
            UIApplication.sharedApplication().openURL(request.URL!)
            print(request.URL?.absoluteString)
            return false
        }
        print(request.URL?.absoluteString)
        lastUrl = (request.URL?.absoluteString)!

        return true
    }


    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        print("webview did fail load with error: \(error)")
        let testHTML = NSBundle.mainBundle().pathForResource("back-error-bottom", ofType: "jpg")
        let baseUrl = NSURL(fileURLWithPath: testHTML!)

        let htmlString:String! = "myErrorinHTML"
        self.webView.loadHTMLString(htmlString, baseURL: baseUrl)
    }

推荐答案

UIWebView => WKWebView Equivalent

UIWebViewDelegate => WKNavigationDelegate

delegate => navigationDelegate
didFailLoadWithError => didFailNavigation
webViewDidFinishLoad => didFinishNavigation
webViewDidStartLoad => didStartProvisionalNavigation
shouldStartLoadWithRequest => decidePolicyForNavigationAction

你可以写大约shouldStartLoadWithRequest个:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")
    
    switch navigationAction.navigationType {
        case .linkActivated:
        if navigationAction.targetFrame == nil {
            self.webView?.loadRequest(navigationAction.request)
        }
        if let url = navigationAction.request.url, !url.absoluteString.hasPrefix("http://www.myWebSite.com/example") {
            UIApplication.shared.open(url)
            print(url.absoluteString)
            decisionHandler(.cancel)
        return
        }
        default:
            break
    }
    
    if let url = navigationAction.request.url {
        print(url.absoluteString)
    }
    decisionHandler(.allow)
}

而对于didFailLoadWithError人来说:

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    print("webView:\(webView) didFailNavigation:\(navigation) withError:\(error)")
    let testHTML = Bundle.main.path(forResource: "back-error-bottom", ofType: "jpg")
    let baseUrl = URL(fileURLWithPath: testHTML!)

    let htmlString = "myErrorInHTML"
    self.webView.loadHTMLString(htmlString, baseURL: baseUrl)
}

Ios相关问答推荐

(Flutter)获取图像从图像拾取器保存和加载问题

与iPadOS中带有扣件的模式相似的组件是什么?

在带有可编码的SWIFT5中,可以轻松处理以美元符号开头的JSON密钥,例如$DATE";

使用AVCaptureEventInteraction捕获音量按键快门

如何将 AppIntent 添加到应用程序目标并在交互式小部件中使用它

如何结合`@dynamicMemberLookup`和`ExpressibleByStringInterpolation`来实现方法链?

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

UIControl 子类 - 按下时显示 UIMenu

如何在 Mac OS Ventura 中使用 Xcode 13

我无法使用 Swift 将文件上传到 firebase

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

使用 Foundation 解压缩文件

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

在 iOS 8.1 模拟器上更改语言不起作用

自动布局:是什么创建了名为 UIView-Encapsulated-Layout-Width & Height 的约束?

iOS 7 及更高版本: for each 视图控制器设置状态栏样式

快速从 NSTimeInterval 转换为小时、分钟、秒、毫秒

使用 Xcode 的 All Exceptions 断点时忽略某些异常

使用 swift 3 在 UIView 上添加阴影

打开 XIB 文件后 Xcode 6.3 冻结/挂起