iOS 侧滑返回假死·push/pop失败

最近改一个项目
里面用到了侧滑返回·部分页面隐藏导航栏
改的过程中发现 上一波人两种效果都没搞好
所以现在我的任务就是把它搞好,可是实际的时候页面切换出现了假死问题
上一个项目是一样的套路,为什么这个项目就出错了呢,搞了我两天后不得不坐下来像个程序员一样一步一步检查代码了

  • 1 遇到的问题->触发手势返回之后 下一次跳转会进入假死状态
  • 2 可能的原因->interactivePopGestureRecognizer失效 · 线程切换问题
1 interactivePopGestureRecognizer的检查

所以先从interactivePopGestureRecognizer设置开始检查
这里也没什么说的,直接之前的代码copy过来

// 这些代码放到继承的UINavigationController里面即可
- (void)viewDidLoad {
    [super viewDidLoad];
    [self updatePopGestureDelegate];
}

- (void)updatePopGestureDelegate {
    /*
     默认全局开启侧滑返回
     在BaseViewController里面每一个viewDidLoad里面设置
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;
     特殊情况下
     在viewDidAppear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = NO
     在viewDidDisappear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = YES
     */
    __weak MHWNavigationController *weakSelf = self;
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.delegate = weakSelf;
        self.delegate = weakSelf;
    }
}

//侧滑代理
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer == self.interactivePopGestureRecognizer && self.viewControllers.count > 1) {
        return YES;
    }
    return NO;
}

实际实际使用中加了这些就够了,但是在运行的时候发现还是不行
所以排除这一块的问题,转向检查线程切换的问题

2 线程切换的检查

因为这个项目里面又的页面隐藏了导航栏,有的页面没隐藏,这样来来去去的很乱,页面切换有的连动画都没有,体验起来就像是个三流app,所以我又加了一个新的BaseViewController并且在里面增加了动画设置

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.navigationController setNavigationBarHidden:self.hideNavigationbarWhenViewWillAppear animated:YES];
    });
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    if (self.hideNavigationbarWhenViewWillDisappear) {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
}

就是这一句dispatch_async啊,就是这线程切换
系统的方法最好不要加线程切换,把这一句dispatch_async去掉
果然就OK了

[self.navigationController setNavigationBarHidden:YES animated:YES];
系统方法最好在默认线程环境执行
就像push pop操作一样在viewWillAppear里面失效一样,线程还是不能乱切
搞了我两天才想到有过这么一个方法设置

关联关键字interactivePopGestureRecognizer·freeze·push not work

你可能感兴趣的:(iOS 侧滑返回假死·push/pop失败)