美文网首页iOS bug修复andiOS进阶指南
iOS弱网环境下,重复点击导致的连续push的问题

iOS弱网环境下,重复点击导致的连续push的问题

作者: Dannn_Y | 来源:发表于2016-04-02 17:52 被阅读1968次
  • 最近网络环境比较差,测试APP的时候也出现了一些问题,例如:点击button需要跳转到另一个页面,点一次没反应,多点了几次,结果就连续push好多这个页面。
    (BaseNavigationController 继承自UINavigationController,在所有使用导航栏的地方都使用BaseNavigationController,像修改返回按钮的样式,文字只需要在BaseNavigationController中进行修改,所有的地方都会被修改)
  • 最后解决了这个问题,在这里记录下,如有。

//在viewDidLoad中添加实现UINavigationControllerDelegate

 -(void)viewDidLoad
{

    [super viewDidLoad];
    __weak BaseNavigationController *weakSelf = self;
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])  {
        self.interactivePopGestureRecognizer.delegate = weakSelf;
        self.delegate = weakSelf;
    }
}
  • 实现协议方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
 {
  //这个方法是在当前控制器执行push的时候,禁止手势右划返回,避免出现crash的现象,(也可以不实现好像也没什么影响)
   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
      self.interactivePopGestureRecognizer.enabled = NO;
    }
//判断上一个控制器和现在的控制器是不是同一个,如果是,返回。如果不是push到当前控制器,这就有效避免了同一个控制器连续push的问题
    if ([self.topViewController isMemberOfClass:[viewController class]]) {
        return;
    }

    [super pushViewController:viewController animated:animated];
}
  • 如果实现了刚才的协议方法,禁止右划返回,就应该实现下面的协议方法,在控制器已经出现的时候,将右划返回打开。
 - (void)navigationController:(UINavigationController *)navigationController
   didShowViewController:(UIViewController *)viewController
                animated:(BOOL)animate
{

   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
       self.interactivePopGestureRecognizer.enabled = YES;
   }
}

希望能有帮助,看的懂。

相关文章

网友评论

  • 吉林天师:1.定一个变量,pushOnce
    2.在viewWillAppear和viewDidLoad 中初始化值为pushOnce =1;
    3.给push穿件外套,别让他裸奔

    if(self.pushOnce == 1){
    [self.navigationController pushViewController:detailVC animated:YES];
    self.pushOnce =0;

    }
    我的问题解决了。
    吉林天师:@我是宋仲基 ViewController里
    英俊神武:您这个方法是放在ViewController里面,还是放在NavigationController里面呢
  • Onego:我觉得这种限制方式不太可行, PUSH当前的 ViewController也是有可能的;
    内存地址这个好像也不太好,总不可能一只保留VC的引用吧
  • 没梦想的咸鱼2://判断上一个控制器和现在的控制器是不是同一个
    应该比较内存地址
    英俊神武:比较内存地址不行啊,重新初始化,内存地址是不一样的
  • ChauvetMa:现实中有业务,是详情页打开详情页,你这个方法就无解了
    Onego:@onetree 我觉得这个方案大致没毛病,只是判断Class有点问题;
    1.Protocol 让所有VC实现没实现的就算不同(事实上一般地址也会不同)
    2.重写isEqual 判断Class + 业务数据(Class + 商品ID)
    3.UIViewController的Category 这个方法避免了Protocol的不足(无法让所有VC实现,这不现实),可以摆脱isEqual的限制随意发挥
    Dannn_Y:@ChauvetMa 这确实是个问题,如果需要打开相同类型的控制器
  • MrFanRG:导航控制器代理方法里的self.topViewController是哪个控制器
    Dannn_Y:@ios码农学生 self.topViewController 指的是上一个push出来的控制器,与当前需要push出来的控制器比较,如果是相同的viewController就不进行push,不过这也有一些问题,当需要push的控制器,上一个和下一个相同时就会出现问题。
  • 煜寒了:小细节,很多应用都有这个问题哈 特别是在地铁里玩手机的时候
  • d1b384e6218b: BaseNavigationController 是什么东西。。

    Dannn_Y:@彩笔小小 是继承自UINavigationController ,根据自己需要在BaseNavigationController中,做修改,

本文标题:iOS弱网环境下,重复点击导致的连续push的问题

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