1

这行代码在 iOS Simulator 6.0 上运行良好,但是当我尝试在我的 iPhone 上运行它时崩溃了,也运行 iOS6。

[menuView addSubview:mvc.view];

为什么会发生这种情况,我该如何解决?

这是代码的更完整版本:

SDMenuViewController *mvc = [[SDMenuViewController alloc] init];
[menuView addSubview:mvc.view];

这就是它崩溃的原因:

2012-10-08 21:32:32.423 CrunchCalculator1-2[21019:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/EDD23933-CE20-4AFD-A2B1-CDD56AD658E8/CrunchCalculator1-2.app> (loaded)' with name 'SDNestedTableView''
*** First throw call stack:
(0x39cd03e7 0x35ece963 0x39cd0307 0x39ee0fd1 0x39ee05ff 0x39dd9031 0x39e0786d 0x39d63419 0xb20d9 0x39d63541 0x39da3d29 0x39d9fac5 0x39de1199 0xb17c5 0x39da4a71 0x39da45f5 0x39d9c803 0x39d44ce7 0x39d44775 0x39d441b7 0x31e145f7 0x31e14227 0x39ca53e7 0x39ca538b 0x39ca420f 0x39c1723d 0x39c170c9 0x39d9b43d 0x39d98289 0xb1523 0x3792fb20)
libc++abi.dylib: terminate called throwing an exception

谢谢!

4

3 回答 3

5

我不太确定它在您的模拟器上是如何工作的(当我在我的模拟器上尝试时,我得到了您在原始问题中列出的崩溃)。无论如何,您可以通过查看以下项目来修复它:

  • 主要问题是 NIB 未包含在捆绑包中。将其添加到项目目标的“复制捆绑资源”中,例如:

复制捆绑资源

  • 在查看“复制捆绑资源”时,您还需要包含SDSubCell.xibSDGroupCell.xib和添加所有这些 PNG 文件。

  • 顺便说一句,虽然它显然不会导致崩溃,但SDNestedTableViewNIB 中的“文件所有者”基类指的是该项目中任何地方都不存在的类。那可不好。无论如何,您可能想将其更改为SDMenuViewControlleror SDNestedTableViewController;

设置文件的所有者基类


这与您的崩溃有点无关,但是当我查看该项目时,我看到了一个令人担忧的结构:

SDMenuViewController *mvc = [[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil];
[menuView addSubview:mvc.view];

您正在创建一个控制器,获取其视图,然后让视图控制器超出范围并被释放(如果您使用的是 ARC)或泄漏它(如果不是 ARC)。

从最初的问题来看,我并不能完全确定您是否正在addSubview作为一种过渡到新视图的方式(这确实是一种不好的做法),或者您是否在进行视图控制器包含。当我查看代码时,您似乎正在执行后者,尽管您的代码中缺少一些调用。您可能想阅读view controller contains。并查看WWDC 2011 session 102

无论如何,上面带有视图控制器alloc/init的那两行代码以及随后的代码addSubview将在您的非 ARC 项目中泄漏(如果您曾经使用 ARC,它会崩溃)并且您的视图层次结构与您的视图控制器层次结构不同步。我建议你可能想要:

SDMenuViewController *mvc = [[[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil] autorelease];
[self addChildViewController:mvc];
[mvc didMoveToParentViewController:self];
[menuView addSubview:mvc.view];

注意autorelease第一行的。

视图控制器包含功能可能很强大,但您要确保完成一些基本的内务处理。


最后一次更新:

我注意到这段代码中有一些错误。首先,您对currentSectionin的使用item:setSubItem:forRowAtIndexPath不起作用。您正在根据最后一个expandingItem. 因此,如果您在展开任一主要项目之前单击其中一项,程序将崩溃。可能最好的方法是完全消除currentSection变量,并在item:setSubItem:forRowAtIndexPath, 使用item.cellIndexPath.row而不是你的变量currentSection

SDNestedTable不幸的是,这个修复导致了一个更严重的问题,这个类本身似乎存在一个 iOS 6 错误。如果您在 iOS 6 上运行它并展开所有项目,滚动到底部然后滚动回顶部,程序将崩溃,因为返回的cellIndexPath属性可以被释放!如果你在 iOS 6 中打开僵尸,你会看到已经被释放。我去下载了原始版本,在那里看到了同样的问题。问题似乎是in被定义为一个属性(这意味着如果 iOS 确定它不再需要它为自己的目的创建的它,即使维护一个SDGroupItem *itemitem:setSubItem:forRowAtIndexPathcellIndexPathcellIndexPathSDGroupCellassignindexPathSDGroupCellassign引用这个释放的对象)。只需将from的cellIndexPath属性更改为,这个 iOS 6 错误就消失了。我已将此问题告知开发人员,但此更改将解决 iOS 6 中代码崩溃的问题。SDGroupCellassignretainSDNestedTableretain

[编辑:作者SDNestedTable同意我对该问题的评估,并报告此问题已在最新版本中修复。- 抢]

最好的祝愿。

于 2012-10-09T02:28:31.260 回答
1

您可能应该在第一行使用initWithNibName:insead 。init不确定您的具体问题,但肯定可以尝试。

于 2012-10-09T02:03:00.787 回答
0

看起来您正在尝试实例化一个名为 SDNestedTableView.nib 的 nib,但它不存在。笔尖是否包含在项目成员中?

于 2012-10-09T05:07:27.653 回答