具有嵌套 UINavigationController 的应用程序在 iOS SDK 4.2 中崩溃
Posted
技术标签:
【中文标题】具有嵌套 UINavigationController 的应用程序在 iOS SDK 4.2 中崩溃【英文标题】:App with nested UINavigationController crashes in iOS SDK 4.2 【发布时间】:2011-01-30 21:47:08 【问题描述】:我正在将应用程序迁移到当前的 ios SDK。它的根控制器是UINavigationController
,另一个UINavigationController
作为第一个视图控制器。
应用程序现在因某种无限递归而崩溃并出现EXC_BAD_ACCESS
,但我无法理解轨迹跟踪。据我所知,什么都没有改变,期望一些项目设置使其在当前 SDK 上编译。
我创建了一个新的基于导航的应用程序并添加了一个嵌套的UINavigationController
,这也使应用程序崩溃。嵌套UINavigationController
s 通常是个坏主意吗?
非常感谢任何可能导致此问题或如何解释堆栈跟踪和调试问题的提示。
【问题讨论】:
是的,嵌套导航控制器是个坏主意。如果您将导航控制器传递给pushViewController:animated:
,它甚至会抛出异常。也许您应该提出一个单独的问题,即如何更好地构建视图控制器和 UI 流。
奇怪的是,IB 允许您添加带有嵌套 UINavigationController
的 NIB。我会看看我是否可以重组我的应用程序。
【参考方案1】:
当您在加载视图之前将父导航控制器的导航栏设置为隐藏(在界面构建器或代码中)时,它将起作用:
navigationController.navigationBar.hidden = YES;
[self.window addSubview:navigationController.view];
【讨论】:
【参考方案2】:拥有一个嵌套的 UINavigationController 似乎很奇怪,但我知道什么。嵌套导航控制器的根视图控制器是什么?希望不是***导航控制器。
【讨论】:
它们是嵌套的,因为我需要有两个单独的视图堆栈。毫无疑问,这可能很奇怪,但它曾经在升级 SDK 后工作并停止。不,没有循环引用。【参考方案3】:这里是:
-
创建一个新的 UINavigationController
在
viewDidLoad
或viewWillLoad
alloc 中,将控制器初始化到您想要的任何根目录
调整 NavigationController 视图的大小并将其作为子视图添加到父 viewCONtroller 的视图(我有 self.contentView)
轰!!
这里是代码..
- (void)viewDidLoad
[super viewDidLoad];
[self.contentView setFrame:CGRectMake(0, 0, self.contentView.bounds.size.width, self.contentView.bounds.size.height)];
mNavController =[[UINavigationController alloc]initWithRootViewController:myNestedRootController]; /
[self.mNavController.view setFrame:CGRectMake(0, 0, self.contentView.bounds.size.width, self.contentView.bounds.size.height)];
[self.mNavController setNavigationBarHidden:YES]; //optional
[self.contentView addSubview:self.mNavController.view];
实际上你可以跳过 contentView 并直接在 viewcontroller's view
上查看 mNavController's
(我的错)
我有一种方法可以推送(只推送)一个新的 VC
-(void)moveToContentViewController:(PM_BaseContentVC *)contentvc animated:(BOOL)animated
[self.mNavController popToRootViewControllerAnimated:NO]; //silently pop the previous viewcontroller
[self.mNavController pushViewController:contentvc animated:YES]; //push new viewcontrolelr
[self.contentView addSubview:self.mNavController.view]; //add the view
欢迎提出建议和优化:)
【讨论】:
以上是关于具有嵌套 UINavigationController 的应用程序在 iOS SDK 4.2 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章