1. 程式人生 > >iOS 如何讓WKWebView側滑返回時html逐級返回,而不是直接返回到上級控制器?

iOS 如何讓WKWebView側滑返回時html逐級返回,而不是直接返回到上級控制器?

iOS使用WKWebView來載入html頁面時,如果html頁面只有一級的話,那麼側滑返回沒什麼問題,但如果html是多級的話,那麼側滑返回時有時就會出現直接返回到上級控制器,而不是返回上一級html頁面。這是因為html頁面的側滑返回和導航控制器的側滑返回發生衝突了,系統無法識別到底是哪一種側滑返回。

WKWebView有一個canGoBack屬性(A Boolean value indicating whether there is a back item in the back-forward list that can be navigated to.),該屬性為true/YES時表示webview當前載入的html的頁面級數 >= 2 ,為false/NO時,表示當前處於html的一級頁面。

那麼,我們可以通過KVO來監聽webview的canGoBack屬性值變化來解決html頁面的側滑返回和導航控制器的側滑返回衝突的問題:即當canGoBack屬性值變為true/YES時,禁用導航控制器的側滑返回手勢;當canGoBack的屬性值變為false/NO時,解禁導航控制器的側滑返回手勢。

具體操作如下:

Swift版:

private let canGoBackKeyPath = "canGoBack"

webView.addObserver(self, forKeyPath: canGoBackKeyPath, options: .new, context: nil)

open override func observeValue(forKeyPath keyPath: String?,
                                    of object: Any?,
                                    change: [NSKeyValueChangeKey: Any]?,
                                    context: UnsafeMutableRawPointer?) {
        guard let theKeyPath = keyPath, object as? WKWebView == webView else {
            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
            return
        }
        if theKeyPath == canGoBackKeyPath{
            if let newValue = change?[NSKeyValueChangeKey.newKey]{
                let newV = newValue as! Bool
                if newV == true{
                    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false;
                }else{
                    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true;
                }
            }
        }
    }


deinit {
        webView.removeObserver(self, forKeyPath: canGoBackKeyPath, context: nil)
    }

OC版:

懶得寫了,自己照著Swift版的轉換一下吧~