Swift中TabBar自带More控制器跳转后再次点击崩溃问题
崩溃根因
你遇到的报错layer <CALayer: 0x2819c05e0> is a part of cycle in its layer tree本质是同一视图被重复插入到视图树中形成循环,你推测的系统尝试重复插入MoreViewController的逻辑是正确的,该问题通常出现在自定义UITabBarController选中逻辑未兼容系统自带UIMoreNavigationController的场景下。
修复方案
- 方案1:拦截UITabBarController选中代理,兼容More控制器逻辑
实现UITabBarControllerDelegate的选中回调方法,主动处理More控制器的返回逻辑,避免系统异常触发层级插入。
Objective-C代码示例:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { // 匹配系统More导航控制器 if ([viewController isKindOfClass:[UIMoreNavigationController class]]) { UIMoreNavigationController *moreNav = (UIMoreNavigationController *)viewController; // 非根页面时主动返回根,避免系统异常处理 if (moreNav.viewControllers.count > 1) { [moreNav popToRootViewControllerAnimated:YES]; } return; } // 原有其他tab的选中逻辑 }
Swift代码示例:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { guard let moreNav = viewController as? UIMoreNavigationController else { // 原有其他tab的选中逻辑 return } if moreNav.viewControllers.count > 1 { moreNav.popToRootViewController(animated: true) } }
- 方案2:排查修改系统More控制器层级的代码
全局搜索项目中对tabBarController.moreNavigationController做addChild、addSubview、修改父控制器的代码,这类强制修改系统私有控制器层级的操作是触发崩溃的常见原因,直接删除相关逻辑即可。 - 方案3:自定义实现More tab逻辑
如果需要对More页面做高度自定义,可直接新建普通ViewController作为第5个tab,手动管理剩余子控制器的列表和跳转逻辑,完全规避系统UIMoreNavigationController的自带逻辑,从根源杜绝该问题。
验证步骤
- 进入More列表页面,点击任意子控制器进入次级页面
- 再次点击底部的More tab,确认页面正常返回More根列表,无闪退即可。
内容的提问来源于stack exchange,提问作者patturik
相关产品推荐
相关产品推荐

