我有一个iOS应用程序,其中包含一个包含6个实体的Core Data模型。实体Name
的设置如下:
班级名称:姓名
模块:当前产品模块
可待因:类定义
(所有其他5个实体的设置类似)。
问题1 (自行修复但留给后人)
代码IS在派生数据文件夹中生成...不是作为预期的〜类定义,而是作为扩展名(如Name+CoreDataProperties.swift
命名。)Codegen是否设置为类定义似乎并不重要或类别/扩展 - 我仍然得到相同的结果。
好的,保持这种想法 - 突然间,现在正在生成类和扩展文件......看起来您需要删除项目的派生数据文件夹并在更新之间重新启动Xcode。忽略问题1
问题2
生成的文件忽略数据模型String属性和关系的可选标志设置 - 它们都是作为选项生成的
问题3 (自行修复但留给后人)
有序关系生成为OrderedSet
(和编译错误)而不是NSOrderedSet
(在重新生成时无法更改它们)
我的解决方法是暂时添加到项目中......
public typealias OrderedSet = NSOrderedSet
好了,现在编译器错误已经消失,似乎可以识别OrderedSet
。忽略问题3.
问题4
以上都不重要,因为编译器无法找到它刚刚生成的文件。对于上面的Name
实体:
:0:错误:没有这样的文件或目录: ' // /Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated名称+ CoreDataClass.swift' :0:错误:没有这样的文件或目录: ' /Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated //名称+ CoreDataProperties.swift'
它正在寻找文件.Name+CoreDataClass.swift
和.Name+CoreDataProperties.swift
的衍生数据 - 请注意'。'在文件名的前面。 (作为临时修复,我将生成的文件添加到项目中)
我认为我做错了,好像每个人都是这样,没有人能够建立一个核心数据项目......或者这些错误是否需要提升?
干杯 灰
(也在Apple开发论坛上提出)
答案 0 :(得分:8)
关于问题1 ,在Inspector中为.xcdatamodel中的实体设置 Codegen 弹出窗口应该是这样的:
类别/扩展程序告诉Xcode生成一个文件,ClassName + CoreDataGeneratedProperties。
类定义告诉Xcode生成两个文件,上面提到的文件,加上ClassName + CoreDataClass。
然而,在Xcode 8.2中似乎存在一个错误。如果在更改其中一个弹出窗口后,只需构建(⌘B)或运行(⌘R),则更改将不会生效。例如,如果您从类定义更改为类别/扩展程序,甚至手动删除了第二个文件,它将重新出现。您甚至可能会发现弹出窗口恢复为原始设置。
为了使这些弹出窗口中的更改生效,您必须
在下一次构建期间(如果在故事板中有@IBInspectable,项目打开时可能会自动发生),将生成或删除派生数据中受影响的文件以符合您的新设置。
更新2016-12-22:谢谢你的评论,Ashley。我现在已经写完并将其提交给Apple Bug Reporter:29789727。更新2017-02-08: Apple已关闭29789727,因为它应该与21205277重复。
答案 1 :(得分:6)
问题4可以通过选择您想要自动生成的所有实体来修复(至少在最新的测试版,第6版中),然后在检查器中清除类 - >模块字段,以便它默认为“全局命名空间”。
答案 2 :(得分:2)
关于问题2:核心数据"可选" flag与Swift的可选概念无关。它们是无关的,并不代表同一件事。将Core Data属性标记为非可选并不意味着它是非可选的,因为Swift定义了该术语。区别在于:
问题#4听起来像是Xcode让它的状态变得混乱,并且可以通过voodoo修复,例如手动清除派生数据文件夹(我知道)。我目前无法复制它,但这并不意味着它不是当前测试版中的错误。
答案 3 :(得分:1)
实际上很容易修复它。
转到配置:
然后删除积分。这些仅适用于较旧的项目。 导入语句在此之后已修复,您可以继续使用。
您还应该将模型放入Global命名空间。我有一个额外的命名空间,但我不知道为什么。
Apples approch就是你可以在自定义框架中使用它。
这个功能非常好,如果你让它工作;)
答案 4 :(得分:1)
看起来Xcode 8.2.1不会关闭codegen。
但您可以从.xcdatamodel内容文件中手动删除codeGenerationType="category"
。
关闭Xcode,删除codeGenerationType
,删除DerivedData文件夹并重建。
将来会等待修复。
答案 5 :(得分:1)
我完全陷入了问题4 ,并且以上都没有为我工作。我使用代码生成。要解决它,我执行了以下步骤:
codeGenerationType="class"
PS:如果您选择手动创建NSManageObject子类而不是使用代码生成,那么请确保在步骤2中从XML文件中的实体中删除codeGenerationType="class"
。