iOS应用初始化UINavigationController出现Pushing a navigation controller is not supported报错
错误原因
你遇到的报错和UINavigationController的初始化方式无关,核心问题是控制器跳转逻辑和API使用不符合iOS规范:
showViewController:sender:的行为由系统根据当前控制器的上下文自动判断:如果当前控制器处于导航栈内,该方法会执行push操作,而iOS明确禁止将UINavigationController作为子控制器push到另一个导航栈中,这是报错的直接原因。- 你的代码存在逻辑冗余:你创建了包着登录页的导航控制器
loginNVC,但跳转时传入的是普通控制器loginVC,且模态跳转的样式设置对象也错用了loginVC而非你要弹出的loginNVC。
修复方案
方案1:保留你设计的「登录/注册页自带独立导航栏」逻辑
直接模态弹出你创建的loginNVC即可,不要使用showViewController避免系统自动判断跳转行为:
loginViewController *loginVC = [[loginViewController alloc] init]; UINavigationController *loginNVC = [[UINavigationController alloc] initWithRootViewController:loginVC]; // 模态样式需设置到你要弹出的导航控制器上 loginNVC.modalPresentationStyle = UIModalPresentationFullScreen; loginNVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; // 使用present接口明确执行模态弹出 [self presentViewController:loginNVC animated:YES completion:nil];
方案2:不需要登录流程独立导航栏
直接删除loginNVC的初始化代码,跳转登录页即可:
如果想要用push跳转(需要先把信息视图套在导航控制器中):
- 先修改AppDelegate的根视图逻辑:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ViewController *rootVC = [[ViewController alloc] init]; // 给信息视图套一层导航控制器,才能支持push操作 UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:rootVC]; self.window.rootViewController = rootNav; [self.window makeKeyAndVisible]; return YES; }
- 跳转代码修改为:
loginViewController *loginVC = [[loginViewController alloc] init]; [self.navigationController pushViewController:loginVC animated:YES];
如果想要用模态弹出,不需要修改AppDelegate:
loginViewController *loginVC = [[loginViewController alloc] init]; loginVC.modalPresentationStyle = UIModalPresentationFullScreen; loginVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentViewController:loginVC animated:YES completion:nil];
内容的提问来源于stack exchange,提问作者UnAvailable404
相关产品推荐
相关产品推荐

