【问题标题】:this class is not key value coding-compliant for the key itemname此类与键 itemname 的键值编码不兼容
【发布时间】:2015-08-27 21:46:22
【问题描述】:

我要做的是获取我的 uitextfield 中名为 editItemField 的文本,并将名为 toDoItemName 的 NSString 中的值写入我的核心数据模型,属性名为 itemname

我收到上述错误。我的核心数据模型有一个名为 itemname 的属性,我假设这可能意味着我正在使用 NSArray 中的对象做某事,但我不能这样做,因为它不是 managedObjectContext 的一部分?

错误

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key itemname.'

代码

- (IBAction)save:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];

if (self.editItemField) {
    // Update existing device
    [self.toDoItemName setValue:self.editItemField.text forKey:@"itemname"];
}
    NSError *error = nil;
    // Save the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

准备工作

我正在通过这个 prepareforsegue 从 uitableview 传递项目。它在新的视图控制器上填充我的 uitextfield。目的是编辑项目,然后用新值更新核心数据模型。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([[segue identifier] isEqualToString:@"EditItemSegue"])
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Item *item = [[self fetchedResultsController]objectAtIndexPath:indexPath];
    [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
    [segue.destinationViewController setToDoItemName:[item valueForKey:@"itemname"]];

}
}

编辑

谁能告诉我这在发送 managedObjectContext 时是否正确?

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([[segue identifier] isEqualToString:@"EditItemSegue"]) {
    EditItem *item = [segue destinationViewController];
    item.managedObjectContext = _managedObjectContext;
}
}

更新转场

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([[segue identifier] isEqualToString:@"EditItemSegue"])
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Item *item = [[self fetchedResultsController]objectAtIndexPath:indexPath];
    EditItem *destination = (EditItem *)segue.destinationViewController;
    destination.managedObjectContext=self.managedObjectContext;
    destination.toDoItem = item;
}
}

[NSManagedObject rangeOfCharacterFromSet:]: 无法识别的选择器发送到实例 0x7fc223f5d350 2015-06-11 23:10:31.717 LittleToDoApp[95329:10363535] *** 由于未捕获的异常 NSInvalidArgumentException 导致应用程序终止,原因:-[NSManagedObject rangeOfCharacterFromSet:] : 无法识别的选择器发送到实例 0x7fc223f5d350

我从未见过这个错误。这是因为它不知道在 EditItem 视图中将其发送到何处?当我点击 uitableview 中的项目时,这当然会发生。

【问题讨论】:

  • self.toDoItemName的类型是什么?
  • @property (strong, nonatomic) IBOutlet UITextField *editItemField; @property (nonatomic, strong) NSString *toDoItemName; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
  • 所以它是一个NSString - 你为什么要把它当作字典?您需要引用您的 NSManagedObject 实例。
  • 这是我第一次涉足核心数据。您能否提供更多有关如何完成的背景信息?我仍在努力解决所有这些问题。
  • 您的 prepareForSegue 中有一个对象 item - 这是您的托管对象,它有一个字段 itemname。您只传递了这个字段,它是一个字符串,为 segue 做准备,但您需要传递项目。

标签: ios objective-c iphone core-data ios7


【解决方案1】:

您需要将NSManagedObject 实例发送到您的下一个视图控制器,而不仅仅是单个字符串

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"EditItemSegue"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        Item *item = [[self fetchedResultsController]objectAtIndexPath:indexPath];
        NextVCClass *destination = (NextVCClass *)segues.destinationViewController;
        destination.managedObjectContext=self.managedObjectContext;
        destination.toDoItem=item; 
    }
}

您需要将 NextVCClass 更改为目标 UIViewController 子类的类

【讨论】:

  • 更新原帖
  • 您需要在目标视图控制器类中更改toDoItemName 的定义。它必须是Item *,而不是NSString *。请注意,在我的回答中,我使用了toDoItemtoDoItemName,因为这是Item 属性的更好名称
  • 天哪。为什么我不能思考。
  • 我不知道我是累了还是我只是意识到我仍然不明白,尽管这似乎是基本的东西。这在我在标题中声明 todoitemname 属性的地方发生了变化?像这样:@property (nonatomic) Item *toDoItem;
  • 是的 - .h 文件中的 @property 定义,用于您的目标视图控制器
猜你喜欢
  • 2017-09-27
  • 2011-03-17
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多