You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:35:05