如何在ViewController1的viewWillAppear中判断其进入方式?
如何判断ViewController1是正向进入还是返回展示?
嘿,这个需求在iOS开发里挺常见的,我给你分享几个实用的实现方案,你可以根据自己的场景选择:
方案一:自定义标记变量(最直观易维护)
这是最简单直接的方式,通过一个布尔变量标记是否是从下一个页面返回:
首先在ViewController1的类扩展里定义一个标记属性:
@interface ViewController1 () @property (nonatomic, assign) BOOL isPoppingBackFromVC2; @end
然后在你跳转到ViewController2的方法里,把这个标记设为YES:
- (void)pushToViewController2 { ViewController2 *vc2 = [[ViewController2 alloc] init]; // 标记即将跳转到VC2,后续返回时会用到 self.isPoppingBackFromVC2 = YES; [self.navigationController pushViewController:vc2 animated:YES]; }
最后在viewWillAppear:方法里判断状态:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.isPoppingBackFromVC2) { NSLog(@"当前是从ViewController2返回展示"); // 重置标记,避免下次进入时误判 self.isPoppingBackFromVC2 = NO; } else { NSLog(@"当前是正向进入ViewController1(从导航控制器直接push或作为根控制器加载)"); } }
方案二:利用UINavigationController代理
通过导航控制器的代理方法跟踪页面跳转状态,适合需要全局监控导航栈的场景:
首先让ViewController1遵守UINavigationControllerDelegate协议,并设置代理:
@interface ViewController1 () <UINavigationControllerDelegate> @property (nonatomic, assign) BOOL isBeingPushed; @end @implementation ViewController1 - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.delegate = self; }
然后实现代理方法记录跳转状态:
#pragma mark - UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (viewController == self) { // 判断是push进入还是pop返回 if (self.isBeingPushed) { NSLog(@"正向进入ViewController1"); self.isBeingPushed = NO; } else { NSLog(@"从ViewController2返回展示"); } } else if ([viewController isKindOfClass:[ViewController2 class]]) { // 准备跳转到VC2,标记状态 self.isBeingPushed = YES; } }
⚠️ 注意:如果导航控制器有其他代理使用者,需要处理代理冲突问题,比如用多代理或者在viewWillDisappear时移除代理。
方案三:通过viewWillDisappear记录导航栈状态
不需要额外标记跳转动作,而是在页面即将消失时记录栈状态:
在ViewController1里定义标记属性:
@interface ViewController1 () @property (nonatomic, assign) BOOL isPushingToNextVC; @end
然后实现viewWillDisappear:记录状态:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSArray *viewControllers = self.navigationController.viewControllers; NSUInteger indexOfSelf = [viewControllers indexOfObject:self]; // 如果当前控制器后面还有其他控制器,说明是push到下一个页面 if (indexOfSelf != NSNotFound && indexOfSelf + 1 < viewControllers.count) { self.isPushingToNextVC = YES; } else { self.isPushingToNextVC = NO; } }
最后在viewWillAppear:里判断:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.isPushingToNextVC) { NSLog(@"从ViewController2返回展示"); self.isPushingToNextVC = NO; } else { NSLog(@"正向进入ViewController1"); } }
总结
如果只是单一页面的需求,方案一是最优选择,代码简洁且不容易出错;如果需要全局监控导航行为,可以考虑方案二;方案三适合不想在跳转方法里额外加标记的场景。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

