【问题标题】:initWithCoder exception when making the main view visible (old IOS project)使主视图可见时的 initWithCoder 异常(旧 IOS 项目)
【发布时间】:2012-11-07 11:45:41
【问题描述】:

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

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

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

我的调查结果:

该项目是对 AppStore 中现有内容的全新 git checkout。是的,该应用程序非常简单,无需任何更新即可正常运行 2 年。

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

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

该应用只有 3 次浏览。主要、细节和关于。看起来 MainView 或 MainViewController 包含问题。我从应用程序没有崩溃的结论是: 1.选择在启动时不将其添加到 NavigationController。 2.选择添加 AboutController。

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

我想知道我是否可以“修复”这个 Xib,或者我是否必须创建一个新的并重新布局 GUI 元素?这是我唯一的出路,我害怕。该应用程序很简单,但重新布局主要(也是最密集的)视图仍然需要一些时间。此外,我更愿意知道问题出在哪里,而不是从头再来,也许有一天会再次陷入同样的​​境地。

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

提前感谢您的任何建议。

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

【问题讨论】:

    标签: objective-c xcode cocoa-touch


    【解决方案1】:

    我可以想到两种可能会导致这种情况,.xib 文件有一些格式问题,或者你在这个 .xib 中使用了一个贬值的对象,所以 SDK 不再具有 .xib 需要的特定 initWithCoder: 方法.

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

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

    【讨论】:

    • 谢谢。您对我的问题的可能原因的推理听起来很可靠。我记得将 xib 版本更改为较新的版本,所以我怀疑我在某个地方有一些旧的(iOS3 时代)小部件。二进制搜索不是我能想到的最有趣的,但你能做什么:)
    【解决方案2】:

    在 Swift 下,这个错误也可能发生,因为 init?(coder aDecoder: NSCoder) 初始化函数是失败的(如 init 后的 ? 所示)。在导致初始化程序失败并返回 nil 的情况下,从情节提要或 nib 初始化对象时会引发错误。

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多