美文网首页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