解决使用系统自带侧滑返回时页面导航栏显示问题

需求(bug)背景:
项目里面有个需求是:在当前页面隐藏导航栏和修改状态栏,其它界面导航栏状态未知(可能显示可能隐藏导航栏);各个页面支持路由任意跳转.一般做法是在viewWillAppear 和viewWillDisappear 里面设置和重置导航栏状态.但是产品要求支持侧滑返回,当用户侧滑到一半取消返回这个时候,再push到下一个页面,下一个页面导航栏状态可能会受到影响.
但是下一个页面是未知的,有可能在viewWillAppear 和viewWillDisappear 等生命周期方法里面做了处理,有可能没有. 我们无法得知更无法干涉下一个页面情况,所以只能在当前页面做处理.

主要是利用了,下面两个代理方法,监听系统侧滑返回时候的拖拽结果

- (void)willMoveToParentViewController:(UIViewController*)parent
- (void)didMoveToParentViewController:(UIViewController*)parent

根据parent 是否为null判断侧滑返回是否成功

进入当前页面
直接点击返回按钮退出页面
拖拽返回不pop当前页面
拖拽返回pop当前页面
下一个页面拖拽返回不pop当前页面打印

下一个页面pop当前页面打印

通过调试发现, willMoveToParentViewController:,分别在viewWillAppear,viewDidAppear, viewWillDisappear,viewDidDisappear 之前调用; didMoveToParentViewController:分别在viewDidAppear 和viewDidDisappear 之后调用

我的解决办法是:
当前VC增加一个属性,记录侧滑返回状态,在合适的时机更新这个值,根据这个值进行判断逻辑

@property(nonatomic, assign) BOOL isDragToPopSuccess; /**< 是否拖拽返回 */
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Yann******====%@",@"viewWillAppear");
    self.isDragToPopSuccess = NO; //  更新isDragToPopSuccess
    // 设置状态栏和其他信息
    [self.timerManager startTimer];
    [[VCManager getNavigationVC] setNavigationBarHidden:YES animated:NO];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Yann******====%@",@"viewWillDisappear");
    
    if (self.isDragToPopSuccess) { // 拖拽返回时候隐藏导航栏
        [[VCManager getNavigationVC] setNavigationBarHidden:YES animated:NO];
    } else { // 非拖拽返回, 说明是push到下一个页面消失
        // 还原配置
        [[VCManager getNavigationVC] setNavigationBarHidden:NO  animated:NO];
        [self.timerManager stopTimer];
        self.statusBarStyle =  UIStatusBarStyleDefault;
        [self setNeedsStatusBarAppearanceUpdate];
    }  
}

- (void)willMoveToParentViewController:(UIViewController*)parent{
    [super willMoveToParentViewController:parent];
    NSLog(@"Yann******====%@,%@",@"willMoveToParentViewController",parent);
    if(!parent){ // 拖拽返回
        self.isDragToPopSuccess = YES;
    } else {
        self.isDragToPopSuccess = NO;
    }
}
- (void)didMoveToParentViewController:(UIViewController*)parent{
    [super didMoveToParentViewController:parent];
    NSLog(@"Yann******====%@,%@",@"didMoveToParentViewController",parent);
    if(!parent){
        NSLog(@"Yann******====页面pop成功了");
    } else { // 滑动pop失败
        self.isDragToPopSuccess = NO;
    }
}

推荐阅读更多精彩内容