使用Xcode版本8.1。
在.xcdatamodeld文件中创建一个名为“MapRegionObject”的实体。
使用自动代码生成器,单击导航栏上的编辑器 - >创建NSManagedOject子类...
有两个文件:MapRegionObject + CoreDataClass.swift和MapRegionObject + CoreDataProperties
屏幕截图中显示的两个文件中的错误: MapRegionObject + CoreDataClass.swift
MapRegionObject + CoreDataProperties
请帮我解决这个错误,非常感谢你!
答案 0 :(得分:123)
在Xcode 8.1中,在使用自动代码生成器之前,必须在数据模型中选择实体:
然后转到数据模型检查器选项卡:
在“Codegen”下选择“手动/节点”
之后,您可以创建一个NSManagedObject
子类而不会出错。
或者,如果您已经使用了“类定义”,则可以进入现有的 .xcdatamodeld 文件,并在Codegen下将所有当前实体设置为“手动/无”。确保保存项目(文件 - >保存),删除现有的派生数据,清理项目,然后构建。为我解决了这个问题,而不必重新制作我的整个模型。
答案 1 :(得分:18)
我发现整件事情非常令人困惑。您确实需要了解CoreData中的新功能。基本上,默认是在名为" DerivedData"的地方自动生成类和扩展名。它隐藏在〜/ Library / Developer / Xcode / DerivedData 中,这些类及其扩展存在于代码源之外。就个人而言,无法打开并看到它们对我来说很奇怪,但有些东西可以用来使用它。
基本上,如果你有一个名为" AppSettings"在您的CoreData模型中,您只需使用它而无需自己生成代码。如果需要项目中的代码,请将实体上的Codegen属性设置为Manual / None。然后执行您之前执行的操作:编辑器 - >创建NSManagedObject类等。文件将在您的项目中结束。
好消息是,如果您想制作自定义扩展程序,只需在项目中执行此操作即可。 Xcode会将生成的文件从项目目录外的其他位置与项目目录中的文件混合。
答案 2 :(得分:3)
问题是您不再需要手动生成NSManagedObjectModel子类。 参考:https://forums.developer.apple.com/thread/48988
Xcode自动生成类或类扩展 核心数据数据模型中的实体和属性。自动代码 生成在逐个实体的基础上启用和禁用,和 使用Xcode 8文件为新模型中的所有实体启用 格式。此功能适用于任何已有的数据模型 升级到Xcode 8格式。您指定Xcode是否生成 使用数据模型文件的数据模型的Swift或Objective-C代码 督察。为实体启用自动代码生成时, Xcode为实体创建类或类扩展 在实体的检查器中指定:使用指定的类名 并将来源放在项目的派生数据中。对彼此而言 Swift和Objective-C,这些类可直接使用 项目的代码。对于Objective-C,将创建一个额外的头文件 对于模型中的所有生成实体:文件名符合 命名约定'DataModelName + CoreDataModel.h'。
答案 3 :(得分:2)
关闭项目并按照以下说明操作:
再次保存并打开Xcode项目。一切都应该运行良好。
答案 4 :(得分:2)
在Xcode 8.2.1中,菜单 - 产品 - 清洁,一切都很好,它是如此真实。
答案 5 :(得分:1)
除非你真的需要改变你生成的属性,否则不要与Xcode对抗,这样做只会让你感到沮丧。
将自动生成的类视为应用程序中的任何其他类。如果需要向托管对象类添加功能,只需将类定义更改为扩展名并扩展对象即可。
改变你的课程:
class MyManagedObject : NSManagedObject { /* implementation*/ }
扩展名:
extension MyManagedObject { /* implementation */ }
答案 6 :(得分:0)
这不是答案。仅仅是对选择的解释
以下是我给自己写的成绩单(并非100%准确):
如果选择此默认值,则默认值为
class definition
。它会 生成该子类,它将正常工作。您将可以访问 您的推文作为“推文”类。听起来不错。顺便说一句,如果你这样做 这将不会显示在文件导航器中。我们最常选择的一个是
category/extension
这样做只会生成Tweet类的扩展。您 必须实际编写tweet类本身。扩展程序将 制作所有变量。即使我切换到类别/扩展名 再次我没有在导航器中显示该扩展程序。它的 对你来说是隐藏的。为什么我们喜欢这个?因为很多时候我们想添加我们的 自己的代码。就像在Tweet中一样,假设您想添加静态方法 从Twitter收集数据并将其转变为 数据库。我们将代码放在哪里?很好的放置代码的地方 将在Tweet课堂上...如果有这样的事情... 扩展程序将为您处理所有var业务。
如果您确实选择了
manual/none
作为代码生成。意思是什么都不做 codegen,那么您会做value/setValue(forKey:)
...祝您好运 这样,您的代码将变得一团糟。 [即没有.propertyName = value
...您必须做setValue(value, forKey: propertyName)
]。
长话短说,我不确定为什么,但是由于某些原因,如果您不选择 create NSManagedObject
子类,那么它似乎仍然有效,但是没有显示幕后情况。非常反感!
现在我们知道我们要访问所有不使用的东西 value / set(value:forKey:)...我们想要拥有以下子类 用户/推文。我们希望所有这些都具有vars [点符号] 关系,因此我们需要生成该代码。我们这样做的方式 我们只是选择实体...,然后我们转到CodeGen。这说 默认情况下是类定义。这意味着它已经完成了。它产生了 称为Tweet的课程。并且它将与var和所有 关系。这实际上不是我们想要的。我们要选择 这个[类别/扩展名]。仅在其中创建对Tweet的扩展 并添加var内容。 这是因为我们要编写课程 鸣叫并在其中放置我们自己的代码。写我们的 自己的课。但是您仍然想要变魔术。