简单,使用WKWebView

展示网页一直不是之前开发的重点,所以之前一直在用UIWebView展示网页,这周打算对项目中的网页展示部分做一次优化。

首先使用WKWebView取代UIWebView,其实WKWebView在iOS8就已经公布了,其性能比UIWebView提高许多,CPU使用降低,2d和3d的表现都明显增强等优点,网上找了一些比较文章。

简单的使用WKWebView

一些基本定义

import WebKit
//因为SB中没有可用的空间,所以只能代码添加
var webView = WKWebView()

在ViewDidLoad中定义大小并加入到自定义个containerView中

self.webView.frame = CGRect(x:0, y: 0, width: view.frame.width, height: view.frame.height - 66)

self.containerView.addSubview(webView)

打开URL

let url = NSURL(string:"http://www.jellytech.com.au")
let request = NSURLRequest(URL:url!)
webView.loadRequest(request)

完成以上内容,基本上已经可以打开一个网页了

Delegate方法

extension WebViewController: WKNavigationDelegate{

    func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
           print("didStartProvisionalNavigation")
    }
    
    func webView(webView: WKWebView, didCommitNavigation navigation: WKNavigation!) {
           print("didCommitNavigation")
    }
    
    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
           print("didFinishNavigation")
    }

    func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
        print("didFailProvisionalNavigation")
    }
    
    func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation!, withError error: NSError) {
        print("didFailNavigation")
    }
}

第二部分是添加 一个简单的Progressbar

先在SB里定义了一个ProgressView

 @IBOutlet weak var progressView: UIProgressView!

ViewDidLoad中,可以考虑放在containerView的下面

//替换self.containerView.addSubview(webView)
self.containerView.insertSubview(webView, belowSubview: progressView)


//ViewDidLoad中,添加一个KVO
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)

重载方法,网上有许多不同的进度条值的写法,这个算最简单的

//swift 2.2
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer) {

        if (keyPath == "estimatedProgress") {
            progressView.hidden = webView.estimatedProgress == 1
            progressView.setProgress(Float(webView.estimatedProgress), animated: true)
        }
    }

最后重点中的重点,特别是对于新手而言,是大部分教程里没有提到的部分,就是离开这个页面的时候请记得移除observer,不然系统会报错!!!

override func viewWillDisappear(animated: Bool) {
        webView.removeObserver(self, forKeyPath: "estimatedProgress")
        super.viewWillDisappear(true)
    }

结尾

突然感到有时间应该整理一下KVO的相关知识。

补充

当从webview界面返回上一页面时,系统奔溃,并且提示添加malloc_error_break(添加方法)。之前在使用UIWebView时,同样的写法并没有出现这个问题。

经过检查发现是因为“使用UIScrollViewDelegate”引起的。但是即使添加了malloc_error_break,因为apple给的说明几乎没用,所以在网上继续搜索一番,发现了一个解决方法, 在deinit中把scrollview的delegate清空。

deinit {
        webView.scrollView.delegate = nil
    }

终于不报错了...

你可能感兴趣的:(简单,使用WKWebView)