登录后加载ViewController导航栏不显示,需禁止返回登录区的解决方法
问题描述
用户登录后通过以下代码跳转至新视图控制器,但出现两个问题:新视图的UINavigationBar未显示,且用户可通过返回操作回到登录页面,希望实现显示导航栏且无法返回登录区域的效果。
原代码:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UINavigationController *homeViewNavigationController = [storyboard instantiateViewControllerWithIdentifier:@"Tab"]; [homeViewNavigationController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentViewController:homeViewNavigationController animated:animated completion:nil];
解决方案
一、替换应用根控制器(推荐方案)
直接将应用的根控制器替换为目标导航控制器,登录页会被完全移除,用户无法返回,同时导航栏能正常显示。
代码示例:
iOS 12及以前(AppDelegate中处理):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UINavigationController *homeNav = [storyboard instantiateViewControllerWithIdentifier:@"Tab"]; // 确保导航栏处于显示状态 homeNav.navigationBar.hidden = NO; // 替换根控制器并添加过渡动画 UIWindow *window = [[UIApplication sharedApplication] keyWindow]; window.rootViewController = homeNav; [UIView transitionWithView:window duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];
iOS 13及以后(SceneDelegate中处理):
若项目使用SceneDelegate,需在对应场景中替换根控制器:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UINavigationController *homeNav = [storyboard instantiateViewControllerWithIdentifier:@"Tab"]; homeNav.navigationBar.hidden = NO; // 获取当前场景的window UIWindowScene *windowScene = (UIWindowScene *)[[UIApplication sharedApplication] connectedScenes].allObjects.firstObject; UIWindow *window = windowScene.windows.firstObject; window.rootViewController = homeNav; [UIView transitionWithView:window duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];
二、检查Storyboard配置
确保Tab导航控制器已启用导航栏:
- 打开Main.storyboard,选中
Tab导航控制器 - 在右侧属性面板中,勾选Shows Navigation Bar选项
如果导航控制器本身未开启导航栏,无论用哪种跳转方式,导航栏都不会显示。
三、放弃present方式
presentViewController是模态展示,会保留登录页的层级,用户可通过返回操作回到登录页;同时若模态展示的导航控制器配置不当,也容易导致导航栏不显示,因此不适合用来实现登录后的跳转。
内容的提问来源于stack exchange,提问作者rihekopo
相关产品推荐
相关产品推荐

