如何隐藏嵌套导航控制器中指定的原UINavigationController?
iOS双导航栏问题:隐藏指定原导航控制器的导航栏
核心问题修正
你当前代码存在一个关键错误:同时手动添加子控制器又调用pushViewController。pushViewController会自动将控制器加入导航栈并管理其视图生命周期,无需手动执行willMoveToParentViewController、addChildViewController、addSubview等容器控制器方法,这是导致视图层级混乱、双导航栏出现的重要诱因。修正后的代码应删除手动添加逻辑:
SampleViewController *viewController = [[SampleViewController alloc] initWithStyle:UITableViewStyleGrouped]; viewController.model = settingsModel; viewController.navigationItem.title = @"Settings"; // 仅保留push操作,导航控制器自动管理控制器与视图 [self.navigationController pushViewController:viewController animated:YES];
隐藏指定原导航控制器(UINavigationController1)的方案
方案1:直接通过根控制器获取目标导航栏
UINavigationController1是window的根控制器,可直接获取并隐藏其导航栏:
iOS 13以下版本
UINavigationController *rootNav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController; [rootNav setNavigationBarHidden:YES animated:YES];
iOS 13及以上版本(适配SceneDelegate)
UIWindow *window = [[UIApplication sharedApplication] connectedScenes].allObjects.firstObject.windows.firstObject; UINavigationController *rootNav = (UINavigationController *)window.rootViewController; [rootNav setNavigationBarHidden:YES animated:YES];
方案2:遍历导航链定位目标控制器
如果根控制器不确定,可从当前控制器向上遍历导航链,定位到最顶层的UINavigationController1:
UIViewController *currentVC = self; // 遍历到导航链的最顶层 while (currentVC.navigationController) { currentVC = currentVC.navigationController; } // 确认是目标导航控制器后隐藏导航栏 if ([currentVC isKindOfClass:[UINavigationController class]]) { [(UINavigationController *)currentVC setNavigationBarHidden:YES animated:YES]; }
内容的提问来源于stack exchange,提问作者DK Manchanda
相关产品推荐
相关产品推荐

