ios 从 UIWebView 迁移到 WKWebView
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/37509990/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Migrating from UIWebView to WKWebView
提问by Phocs
in my app I'm migrating from UIWebView to WKWebView , how can I rewrite these function for WKWebView?
在我的应用程序中,我从 UIWebView 迁移到 WKWebView ,如何为 WKWebView 重写这些函数?
func webViewDidStartLoad(webView: UIWebView){}
func webViewDidFinishLoad(webView: UIWebView){}
and
和
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)
}
回答by Alessandro Ornano
UIWebView => WKWebView Equivalent
UIWebView => WKWebView 等价物
didFailLoadWithError => didFailNavigation
webViewDidFinishLoad => didFinishNavigation
webViewDidStartLoad => didStartProvisionalNavigation
shouldStartLoadWithRequest => decidePolicyForNavigationAction
About shouldStartLoadWithRequest
you can write:
关于shouldStartLoadWithRequest
你可以写:
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((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 where !url.absoluteString.hasPrefix("http://www.myWebSite.com/example") {
UIApplication.sharedApplication().openURL(url)
print(url.absoluteString)
decisionHandler(.Cancel)
return
}
default:
break
}
if let url = navigationAction.request.URL {
print(url.absoluteString)
}
decisionHandler(.Allow)
}
And for the didFailLoadWithError
:
而对于didFailLoadWithError
:
func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation, withError error: NSError) {
print("webView:\(webView) didFailNavigation:\(navigation) withError:\(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)
}
回答by Akila Wasala
Here is the Objective-Cmethods for the migration
这是迁移的Objective-C方法
1) shouldStartLoadWithRequest -> decidePolicyForNavigationAction
1) shouldStartLoadWithRequest -> decisionPolicyForNavigationAction
Remember to call the decisionHandler
记得打电话给 decisionHandler
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked) {
}
NSString *url = [navigationAction.request.URL query];
decisionHandler(WKNavigationActionPolicyAllow);
}
2) webViewDidStartLoad -> didStartProvisionalNavigation
2) webViewDidStartLoad -> didStartProvisionalNavigation
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
}
3) webViewDidFinishLoad -> didFinishNavigation
3) webViewDidFinishLoad -> didFinishNavigation
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
}
4) didFailLoadWithError -> didFailNavigation
4) didFailLoadWithError -> didFailNavigation
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
}
回答by AamirR
Migrating UIWebView to WKWebView, Swift 4:
将 UIWebView 迁移到 WKWebView,Swift 4:
Equivalent of shouldStartLoadWithRequest
:
相当于shouldStartLoadWithRequest
:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
var action: WKNavigationActionPolicy?
defer {
decisionHandler(action ?? .allow)
}
guard let url = navigationAction.request.url else { return }
print(url)
if navigationAction.navigationType == .linkActivated, url.absoluteString.hasPrefix("http://www.example.com/open-in-safari") {
action = .cancel // Stop in WebView
UIApplication.shared.openURL(url) // Open in Safari
}
}
Equivalent of webViewDidStartLoad
:
相当于webViewDidStartLoad
:
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print(String(describing: webView.url))
}
Equivalent of didFailLoadWithError
:
相当于didFailLoadWithError
:
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
let nserror = error as NSError
if nserror.code != NSURLErrorCancelled {
webView.loadHTMLString("404 - Page Not Found", baseURL: URL(string: "http://www.example.com/"))
}
}
Equivalent of webViewDidFinishLoad
:
相当于webViewDidFinishLoad
:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print(String(describing: webView.url))
}