使主视图可见时的initWithCoder异常(旧的IOS项目)

时间:2012-11-07 11:45:41

标签: objective-c xcode cocoa-touch

我打开了一个旧的iOS项目,就像2010年的iOS 3一样,发现它在发布时崩溃了。例外是:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'

我现在已经搞乱了这个项目几个小时,试图找出造成它的原因。我觉得我已经耗尽了我的智慧和资源,没有从头开始重新做大部分的应用程序。关于可能是什么原因的任何想法?

我的调查结果:

该项目是对AppStore中现有内容的全新git结帐。是的,该应用程序非常简单,可以在没有任何更新的情况下运行2年。

我改为使其编译将基础SDK从4.1(在Xcode中不再可用)更改为iOS6并点击运行。目标在项目设置中仍为3.0。

我检查过我在代码中的任何地方都没有调用或实现initWithCoder。我所指示的代码中的行只是对main.m中UIApplicationMain()的调用,这对我没有多大帮助。

该应用只有3次观看。主要,细节和关于。它看起来像MainView或MainViewController包含问题。我在应用程序结束时没有崩溃:1。选择在启动时不将它添加到NavigationController。 2.选择添加AboutController。

我怀疑问题是Xib文件而不是控制器或视图代码,因为我可以使用AboutView Xib初始化MainViewController并启动应用程序。

我想知道我是否可以“修复”这个Xib,或者我是否必须创建一个新的并重新布局GUI元素?这是我唯一的前进方式,我担心。该应用程序错误简单,但仍需要一些时间来重新布局主(和最密集)视图。此外,我更愿意知道问题是什么,而不仅仅是重新开始,有可能在某一天再次陷入同样的​​境地。

我是否在正确的轨道上?有没有办法追踪有问题的代码或GUI小部件?

提前感谢任何建议。

更新:在新的Xib中重新创建UI的基础知识并使用该应用程序后,该应用程序正常运行。还是想知道我是否可以通过更改其中的某些设置来修复旧设置。

2 个答案:

答案 0 :(得分:1)

我可以想到两种可能导致这种情况的可能性,.xib文件存在一些格式问题,或者您在此.xib中使用了折旧对象,因此SDK不再具有特定的initWithCoder:.xib所需的方法

要使Xcode重写文件,并可能修复任何格式问题,请更改文档版本。在Xcode中,选择.xib文件并显示实用程序窗格的文件检查器选项卡以访问版本设置。

对于另一种可能性,我会针对违规对象对.xib执行手动二进制搜索。删除一半对象并运行应用程序。如果它工作,你删除了坏对象。我相信你明白了。可能有多个这样的坏对象,但你应该能够很快找到一个,弄清楚如何更新它,然后修复其他类似的对象。

答案 1 :(得分:1)

在Swift下,也会发生此错误,因为init?(coder aDecoder: NSCoder)初始化函数是可用的(如初始化后的?所示)。在导致初始化程序失败并返回nil的条件下从故事板或笔尖初始化对象时会引发错误。