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

如何隐藏嵌套导航控制器中指定的原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:45:45