【问题标题】:Xcode 8 How to use Core Data Code Gen Classes in Objective-C?Xcode 8 如何在 Objective-C 中使用核心数据代码生成类?
【发布时间】:2017-04-29 04:53:57
【问题描述】:

我正在观看 this tutorial 在 Xcode 8 中使用 Core Data,视频使用的是 Swift。在视频中,他在 Core Data 模型中输入了一个名为Task 的实体,然后在代码中他可以调用Task,例如:

let task = Task(context: context)

我有一个名为Tag 的实体。如何使用 Objective-C 访问代码中的标签? Codegen 设置在 Core Data 模型中,但在我的项目中没有看到任何其他文件。如果我尝试:

Tag test = [[Tag alloc] init];

我收到Tag 不存在的错误。

【问题讨论】:

  • 如果您在项目中打开您的xcdatamodeld 文件并选择您的“Tag”实体,那么选择的 Codegen 选项是什么?如果设置为“manual/none”,则在构建项目时不会生成NSManagedObjectsubclasses。
  • 如果设置为“类定义”,则在您构建项目时将为您生成NSManagedObject 子类,但它们不会显示在您的项目中。
  • @RyanH。它设置为“类定义”。如果它在项目中,我如何访问它们?我在选项中选择了全局命名空间,所以我想我可以说 Tag 并让它显示为一个类。我需要在头文件中导入一些东西吗?
  • 没错,你必须为自动生成的NSManagedObject子类导入头文件。我已经发布了包含更多详细信息的答案。

标签: ios objective-c xcode core-data xcode8


【解决方案1】:
  1. 在模型编辑器中选择实体“标签”。

  2. 通过选择菜单树“编辑器”->“创建 NSManagedObject 子类...”为任务生成源代码 然后按照说明进行操作。

'标签+CoreDataClass.h'

'标签+CoreDataClass.m'

'标签+CoreDataProperties.h'

'标签+CoreDataProperties.m'

文件将被创建并自动附加到您的项目中。

  1. 导入头文件。

    #import "Tag+CoreDataProperties.h"
    
  2. 然后创建“标签”类。

    NSManagedObjectContext *wContext = ((AppDelegate *)UIApplication.sharedApplication.delegate).persistentContainer.viewContext;
    Tag *wTag = [[Tag alloc] initWithContext:wContext];
    wTag.name = @"TEST";
    

【讨论】:

  • 这会立即将标签插入数据库吗? initWithContext 行。
  • 我最终不需要执行第 2 步。我需要的魔法是第 3 步,我不知道该类已创建。我猜第 2 步可能会出现在项目中。第 4 步确实将标签插入到数据库中,所以一切都按我想象的方式工作。谢谢。
【解决方案2】:

如果 Codegen 设置为“类定义”,那么您只需导入实体的 NSManagedObject 子类头文件即可。

导入:

#import "Tag+CoreDataClass.h"

然后您的Tag 对象的创建将被识别。

Tag *tag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:[self managedObjectContext];
tag.name = @"Tag Name";

注意:如果您想查看代表您生成的文件,您可以查看项目的 DerivedData 文件夹。您不应编辑这些文件或将它们导入到您的项目中。

类似:

/Users/{Username}/Library/Developer/Xcode/DerivedData/{Your Project Name}/Build/Intermediates/{Your Project Name}.build/Debug-iphonesimulator/{Your Project Name}.build/DerivedSources/CoreDataGenerated/{Your Project Name}/

还有其他 Codegen 选项可根据您的用例提供不同的选项:

  • 无/手动:允许您自己管理NSManagedObject 子类。使用此选项,您将看到项目中的文件并可以对其进行修改。
  • 类别/扩展:允许您拥有不希望 Core Data 管理的自定义属性(属性)。

我在此处发布了有关 Codegen 选项的更详细答案:https://stackoverflow.com/a/40647786/4748172

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 2011-07-16
    • 2016-11-12
    • 1970-01-01
    • 2017-04-20
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多