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