【问题标题】:How Do I Fix: Terminating app due to uncaught exception 'NSUnknownKeyException'如何修复:由于未捕获的异常“NSUnknownKeyException”而终止应用程序
【发布时间】:2016-01-05 14:52:05
【问题描述】:

我读到其他人也有类似的未捕获异常,但大多数似乎是由于缺少插座连接造成的。我不相信我的与IBOutlets 有关,因为VC 在大多数情况下运行良好,我的其他VCs 也是如此。

我认为这与Core Data 有关。这是错误,我相信它发生在我的表的cellForRowAtIndexPath

2016-01-05 15:18:14.947 Do List[1476:81278] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSManagedObject 0x7fbb89e7cc50> valueForUndefinedKey:]: the entity TomTask is not key value coding-compliant for the key "completedDate".'
*** First throw call stack:
(
0   CoreFoundation                      0x0000000102b5ee65 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000104cfddeb objc_exception_throw + 48
2   CoreFoundation                      0x0000000102b5eaa9 -[NSException raise] + 9
3   CoreData                            0x0000000102757ec1 -[NSManagedObject valueForUndefinedKey:] + 289
4   Do List                             0x000000010235b9d6 _TFC7Do_List24AllocationViewController9tableViewfS0_FTCSo11UITableView21cellForRowAtIndexPathCSo11NSIndexPath_CSo15UITableViewCell + 2630
5   Do List                             0x000000010235c24f _TToFC7Do_List24AllocationViewController9tableViewfS0_FTCSo11UITableView21cellForRowAtIndexPathCSo11NSIndexPath_CSo15UITableViewCell + 79
6   UIKit                               0x0000000103933e43 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 766
7   UIKit                               0x0000000103933f7b -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 74
8   UIKit                               0x0000000103908a39 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2996
9   UIKit                               0x000000010393d01c -[UITableView _performWithCachedTraitCollection:] + 92
10  UIKit                               0x0000000103923edc -[UITableView layoutSubviews] + 224
11  UIKit                               0x00000001038914a3 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
12  QuartzCore                          0x000000010369659a -[CALayer layoutSublayers] + 146
13  QuartzCore                          0x000000010368ae70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
14  QuartzCore                          0x000000010368acee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
15  QuartzCore                          0x000000010367f475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
16  QuartzCore                          0x00000001036acc0a _ZN2CA11Transaction6commitEv + 486
17  UIKit                               0x00000001037d4f7c _UIApplicationHandleEventQueue + 7329
18  CoreFoundation                      0x0000000102a8aa31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
19  CoreFoundation                      0x0000000102a8095c __CFRunLoopDoSources0 + 556
20  CoreFoundation                      0x0000000102a7fe13 __CFRunLoopRun + 867
21  CoreFoundation                      0x0000000102a7f828 CFRunLoopRunSpecific + 488
22  GraphicsServices                    0x0000000106bb7ad2 GSEventRunModal + 161
23  UIKit                               0x00000001037da610 UIApplicationMain + 171
24  Do List                             0x0000000102368fad main + 109
25  libdyld.dylib                       0x000000010a52392d start + 1
26  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

一些注意事项

有一组特定的VCs如果以特定顺序运行,会导致此错误。

当我从A -&gt; B -&gt; C 转到时出现错误,然后尝试放松到A

如果查看上面的异常堆栈,错误发生在allocViewControllercellForRowAtIndexPath 中。那 VCB ,所以它不应该加载,只是被展开。

它引用了“CompletedDate”,这是我昨天添加的新东西,它开始了这一切。 CompletedDate 是一个现有的 CoreData 属性,我刚刚开始在 view controller C 中显示它。

【问题讨论】:

  • 错误消息的关键部分是实体 TomTask 与键“completedDate”的键值编码不兼容 - 这意味着 completedDate 可能不会被声明为具有合成 getter 和 setter 的属性,或者该属性根本不存在。
  • @vadian 如果您查看调用堆栈,它指的是“AllocViewController”,看起来它正在尝试加载其表。然而,这就是正在解散的中间 VC。应该加载的 viewController 表不是 AllocViewController。这有帮助吗?
  • 也许只是一个错字:completedDate != CompletedDate

标签: ios swift core-data uncaught-exception


【解决方案1】:

如果您查看错误的第一行,您会发现您有一个名为 TomTask 的类,您正在尝试使用其中的“completedDate”,但在 TomTask 中没有“completedDate”。

看来(从调用堆栈中的条目 #4 开始)您正试图在该视图控制器的 tableView:cellForRowAtIndexPath: 方法中执行此操作。

【讨论】:

  • 没错!!好吧,我没疯。这就是我认为它在说什么。这是奇怪的事情,在有问题的 VC 中,我没有尝试使用“CompletedDate”。我命令-F 搜索它以仔细检查。所以它的表现就像我在打电话,但我不是。会不会是 Core Data 上下文问题?
  • @DaveG 尝试在调试器中运行您的代码,并在 Objective-C 异常上设置断点,它应该可以让您找到触发该错误的行。
  • 这确定了它并确认问题是一个奇怪的操作顺序。问题似乎源于 VC-A 的 viewDidLoad 获得了新的上下文,然后 VC-B 试图在展开期间加载其表。我正在阅读有关 unwinds 的内容,这种行为显然是正常的,所有视图都在被解雇之前加载回来?
  • 我没想到中间 VC 仍然在视图层次结构中;也许你没有像你想象的那样倒带?或者,也许您正在使用某种演示文稿,其中 VC B 仍然以某种方式可见?
  • A 呈现 B,B 呈现 C。所以我假设层次结构是 A 是 B 的父级,B 是 C 的父级,而 C->A 倒带需要通过 B?但我没想到 B 在展开运行时会运行任何代码。但我读到的所有内容都让我在视觉上看到它并看到它的代码运行听起来很正常。
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 2012-01-04
  • 1970-01-01
  • 2016-08-20
  • 2012-06-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多