美文网首页iOS开发记录ios开发编程知识点
iOS 关于禁止单个页面的边缘返回

iOS 关于禁止单个页面的边缘返回

作者: 无神 | 来源:发表于2015-10-22 11:19 被阅读9346次

    昨天接到新的修改需求,要求有的页面不能返回,必须强制用户往下走流程,当时一听差点给跪啦!无奈啊,谁叫我是干开发的,改吧!初步一想,把返回按钮关掉就OK啦,确实返回按钮关掉就不能按返回按钮返回上一页啦,窃喜!!!后来发现还有边缘返回,这下头疼了,只关掉按钮明显达不到效果,于是赶紧求助小伙伴,各种支招,真是非常的感谢他们,一一试过,发现达不到效果。无奈之下,自己尝试,历经磨难,终于成功,现在献上代码,希望对大家有帮助!写的不好的地方尽请见谅,本人第一次写!

    - (void)viewDidAppear:(BOOL)animated {
    
      [super viewDidAppear:animated];
      self.isCanSideBack = NO;
     //关闭ios右滑返回
     if([self.navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    
      self.navigationController.interactivePopGestureRecognizer.delegate=self;
     }
    }
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
    
       return self.isCanSideBack;
    }
    

    之前的写法,测试之后发现有bug,如果是直接调用[self.navigationController popToRootViewControllerAnimated:YES];不会走viewDidDisappear里的逻辑,离开该页以后,右滑返回失效了,所以做了如下的修改,在离开页面的方法里,调用[self resetSideBack];即可保证只是当前页的右滑返回被关闭,其他页面的右滑返回依然正常!

    - (void)viewDidDisappear:(BOOL)animated {
    
    [superviewDidDisappear:animated];
    [self resetSideBack];
    }
    /**
    *恢复边缘返回
    */
    - (void)resetSideBack {
    
    self.isCanSideBack=YES;
    //开启ios右滑返回
    if([self.navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
    }
    

    补充说明:实现类需要继承 <UIGestureRecognizerDelegate>协议,而 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer是系统自己调用的!

    相关文章

      网友评论

      • 爱吃爱玩写APP的胖仔:你这个方法不管用,,代理方法不走 ~! 继承了代理, 还是不行 ~!
      • 管饱饱:id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
        UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
        pan.cancelsTouchesInView = NO;
        pan.delaysTouchesEnded = NO;
        [self.view addGestureRecognizer:pan];
        管饱饱:@无神 自测不会影响其他页面 这个不是我修改的 我的需求是地图页面屏蔽侧滑 我百度的过程中搜到的这个方法 使用方法时候良好 就顺手贴过来了:joy: :joy:
        无神:@管饱饱 这是你新修改的吗,离开页面的时候需要再恢复回去吗,不然的话会不会影响其他页面的侧滑操作?
      • 微小的沙土:我导航返回不是用self.naviga.....返回,而是隐藏掉self.navigation,自己定义的一个按钮,然后按钮点击写pop方法,那样的话,可能哪里不一样吧,反正用15楼就行了,也就这一个页面不能侧滑,其他页面没问题!
        无神:@UnknownError 我那个是针对系统的导航控制器做的分类,是对导航控制器的delegate做了调整!
      • 陈藩:如果全都不要这个左滑的功能该怎么写呢
        无神:@古墓宅子 你可以用钩子解决,查一下
        陈藩:@无神 之前没写,现在写要改好多啊
        无神:@古墓宅直接写到父类里,继承父类的子类都关闭该功能了
      • MrLanger:我一开始也用self.navigationController.interactivePopGestureRecognizer.enabled = YES,但是发现push到下个界面再侧滑的时候会出现问题,不知道是不是只有我遇到这个问题,然后找到这篇文章,完美解决,谢谢楼主
        无神:@MrLanger 能帮到你是我的荣幸!
      • SunshineDayss:还有一个简单粗暴的方法,在你返回界面的点击事件当中添加 self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        无神:@那倩影丶为谁停留 可以
      • oneDemo:如果你试过了各种方法都还是不行的话,不妨在试试下面的方法。
        id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
        UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
        [self.view addGestureRecognizer:pan];

        直接将代码拷贝到viewDidLoad总就行了,我是深深的买醉了
        无神:@进击的我 能帮到你是我的荣幸!
        c5bd792582a8::heart_eyes: :heart_eyes: :heart_eyes: 我就是无论如何都不行,用了这个就好了~~^_^
        无神:@oneDemo解决问题就行!
      • oneDemo:那个代理方法就不走啊
        无神:@oneDemo 你看一下最后的补充说明
        oneDemo:没有继承啊,我引入了代理
        无神:你继承UIGestureRecognizerDelegate 协议了吗?
      • 廿有四:我表示一旦取消侧滑就恢复不了,你的代码也不行
        无神:@廿有四 你的恢复边缘返回的代码写在viewWillDisappear里时机不对,应该写在viewDidDisappear里,应该确认离开了该页面才恢复边缘返回,你再修改一下试试!
        廿有四:我代码里面是viewWillDisappear里面写可以,但当前页面如果pop到前两个页面,侧滑又全部失灵了。
      • 凌然九霄:我也是,代码全部拷贝了,还是可以滑动
        神秘嘉宾yzj:有问题的,你这么写,第一次肯定还是可以侧滑的;有些页面会返回到上上个页面,禁止侧滑返回可以这么做,在你自己定义的navGationController的代理方法里处理掉
        无神:@凌然九霄 不要忘了继承代理
      • Joneding:我设置了为什么还是可以滑动呢
      • Joneding:你好 我按照你的方法写下来,当我右滑的时候还是没有禁止右滑
        无神:@Joneding 那就好
        Joneding:问题处理掉了.刚开始以为只要右滑都是 iOS7之后的系统的,没有注意到,系统的是边缘右滑,不是全屏右滑,如果是全屏右滑的话那肯定是设置了右滑的手势,可能在你的第三方 UINavigationController+ 的文件里,我的就是别人引入的第三方,加入了全屏手势右滑.最后就是禁用就可以.
        无神:@Joneding 代理什么的也设置了吗,你打断点看看,走禁止右滑的方法了吗?
      • Heikki_:那什么时机 设置代理为 nil呢?
        无神:@sherlock_x 搞错了,惯性, resetSideBack 这个方法里代理已经设置为nil 了! :smile:
      • Heikki_:你好 我今天正好需要实现这个效果 ,用你的代码发现了个小问题 ,应该是你笔误了
        //开启ios右滑返回
        if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
        //这里应该是 self 做代理
        }

        - (void)dealloc{
        self.navigationController.delegate = nil;
        }
        //在 dealloc 中给 delegate置nil

        廿有四:不进这个页面侧滑正常,进了这个页面之后侧滑全不能用了
        廿有四:我以为看到了上帝之光,然并卵
        你老扒拉我嘎哈:他是在DidDisAppear里写的 生命周期里 和dealloc应该是并列的吧
      • zclongjie:大神,再请教一个问题。
        ios10 自带输入法,输入两个拼音时,不显示汉字,显示....求解这个问题如何解决
        无神:@zclongjie 输入法这块还没有碰到过,您再求教一下别人吧,对不起啦!
      • zclongjie:就是按照你的思路写的啊,但是就是不调用gestureRecognizerShouldBegin,找了半天原因还是不行,最后用self.navigationController.interactivePopGestureRecognizer.enabled = NO;,一句话就搞定了 :joy:
        无神:@zclongjie 那不应该啊, :sweat: !你再仔细检查一下您的代码,不行的话我再和您一起看看!
        zclongjie:@无神 这个我写了呀,我都考虑到了,但还是不行
        无神:@zclongjie sorry,我的错,要继承 <UIGestureRecognizerDelegate>,gestureRecognizerShouldBegin是系统自己调用的!
      • zclongjie:我用你的方法无效,不调用gestureRecognizerShouldBegin,用self.navigationController.interactivePopGestureRecognizer.enabled = NO;反倒成功了
        微小的沙土:我也是,代理手势后那方法gestureRecognizerShouldBegin都没走,怎么禁用。。。
        无神:@zclongjie 你是完全按照我的代码套路去写的代码了呢,还是只copy了一部分啊,我的代码是经过我自己反复测试过的,是可以正确实现所需功能的!
      • 小雨雨儿:方法可行
        无神:@小雨雨儿 不谢!能帮到你是我最大的荣幸!
        小雨雨儿:@无神 嗯,刚实践了,谢啦
        无神:@小雨雨儿 这个是检验过的,可行!
      • sonialiu:都是正常的呢
      • sonialiu:不是可以直接这样设置吗?
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        让系统左滑失效
        无神:@404你懂得 好吧
        sonialiu:@无神 我试过,是可以的,我用的就是这么这句话
        无神:@404你懂得 好像是行不通的,你可以试试!

      本文标题:iOS 关于禁止单个页面的边缘返回

      本文链接:https://www.haomeiwen.com/subject/iidthttx.html