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.
相关产品推荐
相关产品推荐

