需求(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;
}
}