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

Objective-C执行push Segue时触发Unrecognized selector错误如何解决

问题修复方案

崩溃原因

报错信息明确说明崩溃触发点为:-[MainTabBarController topViewController]: unrecognized selector,即:

  • topViewController 是 UINavigationController 类的专属方法
  • 你当前 segue.destinationViewController 的实际类型是 MainTabBarController,该类没有实现 topViewController 方法,调用不存在的方法就触发了非法参数异常

修复方案

根据你的业务场景二选一即可:

方案1:调整代码适配目标控制器为TabBar的情况

如果你的Segue本来就是要跳转到MainTabBarController,且MainViewController是TabBar下的某个子控制器,修改代码如下:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"[segue identifier]: %@",[segue identifier]);

    if ([[segue identifier] isEqualToString:@"sync"]) {
        // 先将目标控制器转成实际类型MainTabBarController
        MainTabBarController *tabVC = (MainTabBarController *)segue.destinationViewController;
        MainViewController *mainViewSync;
        // 假设MainViewController是TabBar当前选中的Tab对应的控制器
        UIViewController *selectedVC = tabVC.selectedViewController;
        if ([selectedVC isKindOfClass:[UINavigationController class]]) {
            // 如果选中的Tab外层套了导航控制器,就先取导航的顶层控制器
            mainViewSync = (MainViewController *)((UINavigationController *)selectedVC).topViewController;
        } else {
            // 如果选中的Tab直接就是MainViewController,直接转换即可
            mainViewSync = (MainViewController *)selectedVC;
        }
        mainViewSync.sync = 1;
    }
}

方案2:修正Storyboard的Segue关联

如果你的Segue本来应该跳转到外层套了UINavigationController的MainViewController,但误关联到了MainTabBarController,直接打开Storyboard找到ID为sync的Segue,把目标控制器改成对应的UINavigationController即可,原有代码不需要修改。

优化建议

后续可以增加类型判断逻辑,避免强制转换带来的潜在崩溃:

if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) {
    // 处理目标为导航控制器的逻辑
} else if ([segue.destinationViewController isKindOfClass:[MainTabBarController class]]) {
    // 处理目标为TabBar控制器的逻辑
}

内容的提问来源于stack exchange,提问作者Fabrizio L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:02