iOS 如何让WKWebView侧滑返回时html逐级返回,而不是直接返回到上级控制器?

原创 2018年04月16日 15:47:23

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版的转换一下吧~



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huxinguang_ios/article/details/79960947

iOS侧滑返回上一级界面

- (id)initWithRootViewController:(UIViewController *)rootViewController {     self = [super init...
  • csgcsg123
  • csgcsg123
  • 2015-09-28 14:47:19
  • 572

WKWebView返回某个历史页面

WKWebView 有时候,在h5页面进行跳转的时候,需要退出到某个加载历史的web页面,此时则需要使用WKWebView里面新增的API。 /** * 在...
  • dachao_me
  • dachao_me
  • 2015-09-14 14:56:03
  • 6728

iOS侧滑返回功能实现

方案一 :开启使用系统自带的侧滑返回 iOS7之后系统提供了侧滑手势(interactivePopGestureRecognizer),即从屏幕左侧边缘滑起会pop回导航控制器栈的上个viewCont...
  • zhaojinqiang12
  • zhaojinqiang12
  • 2016-05-25 21:24:26
  • 2568

iOS开发——返回特定的控制器

用导航控制器返回到上一页和返回到根控制器有其自带方法。 返回到特定的控制器的核心代码: popToViewController用法 [self.navigationController...
  • IT_liuchengli
  • IT_liuchengli
  • 2016-04-28 11:44:05
  • 2685

WKWebView常见功能及如何返回上级界面

1、WKWebView的简单初始化- (WKWebView *)webView{ if (_webView == nil) { _webView = [[WKWebView a...
  • u013094208
  • u013094208
  • 2016-07-22 10:49:41
  • 10404

iOS自定义导航控制器侧滑返回的多种实现方法

*我们都知道,iOS7导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能。 但是如果我们从从导航控制器的返回按钮,就发现系统所带的侧滑返回功能无法使用。因此为了解决此问题,有...
  • ai379558502
  • ai379558502
  • 2015-10-29 14:11:53
  • 2839

iOS navigationController中回到tabbarController根视图方法

根据需求来改变跳转: [self.navigationController popToRootViewControllerAnimated:NO]; [self dismissViewCon...
  • u010960265
  • u010960265
  • 2017-10-14 09:53:10
  • 241

iOS rootViewController侧滑返回卡住的解决方法

第一步:在你的navigationController的viewDidLoad方法里面: - (void)viewDidLoad {     [super viewDidLoad];    ...
  • fanhaofei1234
  • fanhaofei1234
  • 2016-03-07 13:25:49
  • 876

js返回上级页面和上上级页面

js返回上级页面有两种情况:     一:返回上级页面无刷新的     1:           返回上级页面     2:           返回上级页面     返回上上...
  • renzhenhuai
  • renzhenhuai
  • 2014-01-06 10:04:23
  • 7905

IOS如何返回到tabbar第一个按钮的主页面

如图所示,当我们点击 消息、好友、我的按钮之后,如果用户没有登录,会出现登录页面,而此时我们点击登录页面的返回按钮,想返回到地图页面,该如何实现呢?在返回按钮的方法中实现如下代码: self.n...
  • sarahLearn
  • sarahLearn
  • 2015-02-28 15:56:00
  • 4410
收藏助手
不良信息举报
您举报文章:iOS 如何让WKWebView侧滑返回时html逐级返回,而不是直接返回到上级控制器?
举报原因:
原因补充:

(最多只允许输入30个字)