iOS技术求助:跳转后的视图控制器显示后立即返回原控制器
嘿,看了你遇到的问题——第二个视图控制器刚显示出来就立刻被弹回第一个VC,调试能看到viewDidLoad正常执行、表格也填充了数据,但紧接着就触发viewWillDisappear,仿佛被强制移除了。结合你给出的第一个VC代码,我整理几个最可能的原因和解决办法:
1. 跳转逻辑写错了(最常见的坑)
你没贴点击cell时的跳转代码,但十有八九是这里出了问题。比如不小心在跳转后立刻调用了返回方法,或者跳转方式用错了:
- 先检查你的
tableView:didSelectRowAtIndexPath:方法,确保是正确的push/present:
重点确认:这段代码里绝对不能出现- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 实例化第二个VC(替换成你的实际类名) YourSecondViewController *secondVC = [[YourSecondViewController alloc] init]; // 传递数据(如果需要) secondVC.selectedResearch = self.researches[indexPath.row]; // 正确的push到导航栈 [self.navigationController pushViewController:secondVC animated:YES]; // 如果是present的话,不要立刻调用dismiss // [self presentViewController:secondVC animated:YES completion:nil]; }[self.navigationController popViewControllerAnimated:YES];或者[self dismissViewControllerAnimated:YES completion:nil];这类返回代码,也不要有重复执行跳转逻辑的情况。
2. 第二个VC内部有主动返回的代码
检查第二个VC的生命周期方法(比如viewDidLoad、viewWillAppear),有没有不小心加了返回上一页的代码,比如:
// 错误示例!不要在第二个VC里写这个 [self.navigationController popViewControllerAnimated:YES];
另外,检查第二个VC的界面控件,有没有按钮的IBAction不小心绑定了返回方法,且这个按钮在视图加载时被误触发(比如按钮frame覆盖了整个屏幕,或者代码里主动调用了sendActionsForControlEvents:)。
3. 导航栏设置的潜在冲突?
看你第一个VC的viewWillDisappear里把导航栏背景设为了nil:
- (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; }
虽然这个操作本身不会直接导致VC被弹出,但如果第二个VC对导航栏做了特殊设置(比如隐藏导航栏后又强制显示),可能间接引发问题。可以先注释掉这段代码测试一下,看问题是否消失。
4. 内存管理问题(可能性较低但需排查)
如果第二个VC的对象被提前释放,也会导致视图突然消失。检查:
- 在第一个VC跳转时,第二个VC的局部变量是强引用(默认局部变量都是强引用,没问题);
- 第二个VC里的核心数据属性(比如表格数据源)要用
strong修饰,不要用weak:@property (strong, nonatomic) NSArray *researchData;
补充:你的代码有截断
你贴的第一个VC代码最后一行是status.dbId = research.s,明显没写完,建议检查完整代码里有没有逻辑错误——比如在cellForRowAtIndexPath里不小心触发了跳转逻辑?
先从「跳转代码错误」这个最常见的原因开始排查,应该能很快定位到问题!
内容的提问来源于stack exchange,提问作者Aliaegon

