[ios]core data此类不是键值编码符合标准关键字名称

发布时间: 2017/3/28 21:36:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我不得不将core data添加到现有的项目,但我都是一个实体和一个归之于它。我有一个名为"地方"的实体和属性的命名 name 。我似乎变得 SIGABRTcell.nameLabel.text 线︰

NSManagedObject *Item = [placesArray objectAtIndex:indexPath.row];

cell.nameLabel.text = [NSString stringWithFormat:@"%@", [Item valueForKey:@"name"]

导入"Places.h"即 NSManagedObject 子类。我也不知道什么可以可能是这件事。

所有帮助被都感激,谢谢你提前。

编辑︰ 这里是完整的错误︰

    2014-07-30 08:56:11.415 FindItHere[1216:60b] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0x1f7dc> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.'
*** First throw call stack:
(
    0   CoreFoundation                      0x01d5c1e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01adb8e5 objc_exception_throw + 44
    2   CoreFoundation                      0x01debfe1 -[NSException raise] + 17
    3   Foundation                          0x0158ec7a -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 282
    4   Foundation                          0x014fbdfd _NSGetUsingKeyValueGetter + 81
    5   Foundation                          0x014fb437 -[NSObject(NSKeyValueCoding) valueForKey:] + 260
    6   FindItHere                          0x0000f6dc -[FindTableViewController tableView:cellForRowAtIndexPath:] + 508
    7   UIKit                               0x0068711f -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 412
    8   UIKit                               0x006871f3 -[UITableView _createPreparedCellForGlobalRow:] + 69
    9   UIKit                               0x00668ece -[UITableView _updateVisibleCellsNow:] + 2428
    10  UIKit                               0x0067d6a5 -[UITableView layoutSubviews] + 213
    11  UIKit                               0x005fd964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    12  libobjc.A.dylib                     0x01aed82b -[NSObject performSelector:withObject:] + 70
    13  QuartzCore                          0x04c1145a -[CALayer layoutSublayers] + 148
    14  QuartzCore                          0x04c05244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    15  QuartzCore                          0x04c050b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    16  QuartzCore                          0x04b6b7fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
    17  QuartzCore                          0x04b6cb85 _ZN2CA11Transaction6commitEv + 393
    18  QuartzCore                          0x04b6d258 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    19  CoreFoundation                      0x01d2436e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    20  CoreFoundation                      0x01d242bf __CFRunLoopDoObservers + 399
    21  CoreFoundation                      0x01d02254 __CFRunLoopRun + 1076
    22  CoreFoundation                      0x01d019d3 CFRunLoopRunSpecific + 467
    23  CoreFoundation                      0x01d017eb CFRunLoopRunInMode + 123
    24  GraphicsServices                    0x031745ee GSEventRunModal + 192
    25  GraphicsServices                    0x0317442b GSEventRun + 104
    26  UIKit                               0x0058ef9b UIApplicationMain + 1225
    27  FindItHere                          0x0000c54d main + 141
    28  libdyld.dylib                       0x02e0d70d start + 1
    29  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

并且此错误发生在这个确切的行︰

[cell.nameLabel setText:[NSString stringWithFormat:@"%@", [Item valueForKey:@"name"]]];

编辑 #2︰ 这里是我如何填充我在 viewDidLoad 的数组︰

placesArray = [[NSMutableArray alloc] init];


self.tableView.delegate = self;
self.tableView.dataSource = self;

[placesArray addObject:@"ATM"];
[placesArray addObject:@"Park"];
[placesArray addObject:@"Restaurant"];
[placesArray addObject:@"Library"];
[placesArray addObject:@"Gas Station"];
[placesArray addObject:@"Florist"];
[placesArray addObject:@"Cafe"];

解决方法 1:

看看你已经提供的代码,你实际上不使用 CoreData 根本。

placesArray = [[NSMutableArray alloc] init];

[placesArray addObject:@"ATM"];
[placesArray addObject:@"Park"];
[placesArray addObject:@"Restaurant"];

上面的代码显示,而不是使用您 CoreData 实体 Item ,相反只使用一个单位出 NSString 。这使得它崩溃,因为当您执行以下操作︰

NSManagedObject *Item = [placesArray objectAtIndex:indexPath.row];
cell.nameLabel.text = [NSString stringWithFormat:@"%@", [Item valueForKey:@"name"]

你正在做的等效︰

cell.nameLabel.text = [NSString stringWithFormat:@"%@", [{NSString} valueForKey:@"name"]

你有两种解决方案︰

1) 除去 CoreData,因为它看起来不像你实际使用它。而不是 ItemNSManagedObject 你能把它常规 NSObject 。这是更快的解决方案,可能会甚至使您更有意义。这使得您的代码如下︰

placesArray = [[NSMutableArray alloc] init];

for (int i = 0; i < items.count; i++)
{
  Item *newItem = [Item new];
  newItem.name = @"ATM";
  ...
  [placesArray addObject:newItem];
}

Item *cellItem = [placesArray objectAtIndex:indexPath.row]
cell.nameLabel.text = cellItem.name;

2) 你们成立了 ManagedObjectContextPersistantSToreCoordinator ,等等?如果不是,然后查找有关如何在您的项目中正确设置了 CoreData 教程。 如果你有,你需要得到 NSManagedObjectContext,请执行下列操作之一︰

  • 检测是否 CoreData 数据库中。如果不是,那么你需要做 insertNewObjectForEntityForName 和保存您后的上下文。如果它在您的数据库,那么你需要做 FetchRequest看看这个指南如何去做。
赞助商