在自动代码中无效重新生成NSManagedObject Subclass Swift 3
使用Xcode的8.1版本。
在.xcdatamodeld文件中创build一个名为“MapRegionObject”的实体。
使用自动代码生成器,单击导航栏上的编辑器 – >创buildNSManagedOject子类…
有两个文件:MapRegionObject + CoreDataClass.swift和MapRegionObject + CoreDataProperties
在截图中显示两个文件中的错误:MapRegionObject + CoreDataClass.swift
MapRegionObject + CoreDataProperties
请帮我修复这个bug,非常感谢你!
在Xcode 8.1中,在使用自动代码生成器之前,请select数据模型中的实体:
然后转到数据模型检查器选项卡:
在“Codegen”下select“Manual / Node”
之后,你可以创build一个NSManagedObject
子类没有错误。
或者,如果您已经使用了“类定义”,则可以进入现有的.xcdatamodeld文件,并将所有当前实体设置为Codegen下的“手动/无”。 确保保存你的项目(文件 – >保存) ,删除你现有的派生数据,清理项目,然后构build。 为我解决了,而不必重新制作我的整个模型。
我发现这整个事情是非常混乱。 您确实需要了解CoreData中的新增function。 基本上,默认是在一个名为“DerivedData”的地方为你自动生成类和扩展,这个地方被埋在〜/ Library / Developer / Xcode / DerivedData中 ,这些类和它们的扩展在代码源之外。 就个人而言,打开和看他们对我来说是不可思议的,但有些东西是可以使用的。
基本上,如果你的CoreData模型中有一个名为“AppSettings”的实体,你可以直接使用它,而不需要自己生成代码。 如果您需要项目中的代码,则将实体上的Codegen属性设置为Manual / None。 然后做你之前做的:编辑器 – >创buildNSManagedObject类等。这些文件将在您的项目中结束。
好消息是,如果你想自定义扩展,只需在你的项目中做到这一点。 Xcode会将生成的文件从项目目录外的其他位置混合到项目目录中的文件中。
1)清理项目(cmd + shift + K)
2)在“数据模型检查器”中为每个创build的实体设置Class属性,如下面的截图所示
3)再次生成代码(编辑器 – >创buildNSManagedObject子类)
之后,一切应该正常工作。
closures该项目并按照以下说明操作:
- 在finder中显示你的数据库.xcdatamodeld文件。
- 在.xcdatamodeld文件上右键单击 – >显示包装内容,如果(.xcdatamodel)在包装中再次find,请再次右键单击并显示包装内容。 你应该得到'内容'文件。
- 在文本编辑中打开“内容”。
- Command-F(codeGenerationType =“class”)并用空stringreplace所有匹配的string。
保存并再次打开Xcode项目。一切都应该运作良好。
问题是你不需要手动生成NSManagedObjectModel子类。 ref: https : //forums.developer.apple.com/thread/48988
Xcode自动为Core Data数据模型中的实体和属性生成类或类的扩展。 自动代码生成是基于实体启用和禁用的,并且使用Xcode 8文件格式为新模型中的所有实体启用。 此function适用于任何已升级到Xcode 8格式的数据模型。 您可以指定Xcode是否使用数据模型的文件检查器为数据模型生成Swift或Objective-C代码。 为实体启用自动代码生成时,Xcode会为实体的检查器中指定的实体创build一个类或类的扩展名:使用指定的类名称,并将源放置在项目的派生数据中。 对于Swift和Objective-C,这些类都可以直接从项目的代码中使用。 对于Objective-C,为您的模型中的所有生成的实体创build一个额外的头文件:文件名符合命名约定“DataModelName + CoreDataModel.h”。
在Xcode 8.2.1中,Menu-Product-Clean,一切都好,真是太好了。
我发现这个post对我的问题非常有用。
Core Data Swift 3.0中的新function
如何在iOS 10中使用核心数据(Swift 3)
除非你真的需要改变你生成的属性,否则不要与Xcode对抗,这样做只会让你感到沮丧。
将自动生成的类视为应用程序中的其他类。 如果您需要为托pipe对象类添加function,只需将您的类定义更改为扩展名并扩展您的对象即可。
改变你的课堂:
class MyManagedObject : NSManagedObject { /* implementation*/ }
扩展名:
extension MyManagedObject { /* implementation */ }