iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

Posted

技术标签:

【中文标题】iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?【英文标题】:iOS:How to open Another UINavigationController inside Existing UINavigationController? 【发布时间】:2013-02-06 06:59:19 【问题描述】:

我正面临以下代码的崩溃。场景是

这是我使用 UINavigationController 加载 RTC_HomeVC 的应用程序委托方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
RTC_HomeVC *obj_RTC_HomeVC=[[RTC_HomeVC alloc]init];
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:obj_RTC_HomeVC];
// Override point for customization after application launch.
self.window.rootViewController=nav;
[obj_RTC_HomeVC release];
[nav release];

self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;

现在我想在父导航控制器中打开 UINavigationController。所以我使用以下代码。方法 -(IBAction)call_SectionFlow 在 RTC_HomeVC 中。


-(IBAction)call_SectionFlow
RTC_1_StoreDetailsVC *obj_StoreDetailsVC=[[RTC_1_StoreDetailsVC alloc]initWithNibName:@"RTC_1_StoreDetailsVC" bundle:nil];
RTC_3_EnablingWorksVC *obj_EnablingWorksVC = [[RTC_3_EnablingWorksVC alloc]initWithNibName:@"RTC_3_EnablingWorksVC" bundle:nil];
UINavigationController *navController_Sections = [[UINavigationController alloc] init];
NSArray *array_ControllerArray=[[NSArray alloc]initWithObjects:obj_StoreDetailsVC,obj_EnablingWorksVC, nil];
[navController_Sections setViewControllers:array_ControllerArray animated:FALSE]
navController_Sections.view.frame=CGRectMake(14, 40, 996,636 );
[self.view addSubview:[[[navController_Sections viewControllers] objectAtIndex:0] view]];


当我调用此方法时,应用程序崩溃了。这是崩溃日志。

崩溃日志: * 由于未捕获的异常“UIViewControllerHierarchyInconsistency”而终止应用程序,原因:“子视图控制器: 应该有父视图控制器: 但实际父视图是:” * 首先抛出调用栈: (0x1c9c012 0x10d9e7e 0x1c9bdeb 0x6838a 0x68739 0x6f5a3 0x67eed 0x4fc3 0x10ed705 0x24920 0x248b8 0xe5671 0xe5bcf 0xe4d38 0x5433f 0x54552 0x323aa 0x23cf8 0x1bf7df9 0x1bf7ad0 0x1c11bf5 0x1c11962 0x1c42bb6 0x1c41f44 0x1c41e1b 0x1bf67e3 0x1bf6668 0x2165c 0x1f82 0x1c45) libc++abi.dylib:终止调用抛出异常


谁能告诉我

    这段代码有什么问题?我应该采用哪种方法来解决此崩溃? 如何在现有的 UINavigationController 中打开另一个 UINavigationController?

谢谢。

【问题讨论】:

[self.navigationController pushViewXXXX:myNewNavigationController] 不支持推送导航控制器。 你在哪里调用 [self.view addSubview:[[[navController_Sections viewControllers] objectAtIndex:0] view]];我想你可能只想要 [self.view addSubview:navController_sections.view]; 为什么要将导航控制器推入导航控制器? 【参考方案1】:

不要不要手动将子视图添加到UIWindow。不支持(或至少无法正常工作)。

使用这个方法:

[firstNavigationVC presentViewController:secondNavigationVC animated:YES completion:nil];

导致崩溃的原因是,您将obj_StoreDetailsVC 添加到新导航控制器,然后将其视图添加到self.view。一旦一个 VC 是另一个 VC 的子级,它的view 必须是该 VC 的view 的后代。也许您可以将secondNavigationVC 的视图添加到firstNavigationVC 的视图中,但这不是UIKit 应该工作的方式。使用上述方法。

【讨论】:

你“可以”这样做: UIView *rootView = [[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0]; [rootView addSubview:dview]; 为什么你会曾经想要这样做?!不要不要访问 UIWindow 的子视图,因为有一些私有视图层次结构。 好吧,您没有注入新的子视图,而是将子视图添加到子视图堆栈顶部的视图中。我说你“可以”不是你应该。我实际上使用它在一般触发的代码中添加覆盖。通过以这种方式添加子视图,我永远不需要知道我在视图堆栈中的哪个位置,我总是可以覆盖。 您有风险,某些窗口功能会停止为这个“覆盖”工作。自动旋转?事件处理?模态演示?您应该在自己的根视图控制器中执行叠加等操作,因为这样您就可以确定它在下一个 ios 版本中也能正常工作。

以上是关于iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

如何在现有 iOS 应用中更新 AdMob

如何在 IOS 中编辑现有 UI 以在正确的框架中显示按钮?

如何在 iOS 中获取现有 MP3 或 AAC 的比特率?

如何在 iOS 中构建由现有控件组成的自定义控件?

如何将用户添加到 XMPP iOS 中的现有 ROOM?