具有嵌套 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,这也使应用程序崩溃。嵌套UINavigationControllers 通常是个坏主意吗?

非常感谢任何可能导致此问题或如何解释堆栈跟踪和调试问题的提示。

【问题讨论】:

是的,嵌套导航控制器是个坏主意。如果您将导航控制器传递给pushViewController:animated:,它甚至会抛出异常。也许您应该提出一个单独的问题,即如何更好地构建视图控制器和 UI 流。 奇怪的是,IB 允许您添加带有嵌套 UINavigationController 的 NIB。我会看看我是否可以重组我的应用程序。 【参考方案1】:

当您在加载视图之前将父导航控制器的导航栏设置为隐藏(在界面构建器或代码中)时,它将起作用:

navigationController.navigationBar.hidden = YES;
[self.window addSubview:navigationController.view];

【讨论】:

【参考方案2】:

拥有一个嵌套的 UINavigationController 似乎很奇怪,但我知道什么。嵌套导航控制器的根视图控制器是什么?希望不是***导航控制器。

【讨论】:

它们是嵌套的,因为我需要有两个单独的视图堆栈。毫无疑问,这可能很奇怪,但它曾经在升级 SDK 后工作并停止。不,没有循环引用。【参考方案3】:

这里是:

    创建一个新的 UINavigationController 在viewDidLoadviewWillLoadalloc 中,将控制器初始化到您想要的任何根目录 调整 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 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

私有的嵌套类(内部或静态)是不是可能具有具有公共访问权限的方法?

Ramda js:具有嵌套对象数组的深度嵌套对象的镜头

将嵌套的 json 导入为具有多个嵌套的表

具有共享滚动手势的嵌套 UITableView

具有水平滚动的嵌套 RecyclerView 中的滚动行为

CUDA:并行化具有嵌套循环的函数调用的多个嵌套for循环