簡單,使用WKWebView

weixin_33913332發表於2016-07-05

展示網頁一直不是之前開發的重點,所以之前一直在用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<Void>) {

        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
    }

終於不報錯了...

相關文章