XCode Cant'编辑CoreData模型

Ada*_*uer 11 core-data ios

使用后将CoreData模型添加到现有项目中

File > New > File... > Core Data > Data Model

我无法编辑模型.该项目现在包含.xcdatamodeld包引用,但在Project Navigator中单击它与单击文件夹或组具有相同的效果,当前编辑器不会更改.右键单击引用并选择"打开为">列出没有潜在的编辑器.此外,打开文件检查器面板仅列出"身份""目标成员身份"和"文本设置"的设置,它不会列出"核心数据模型"或"版本化核心数据模型"的设置

这并不会对XCodes识别文件类型的能力产生任何影响,但我还在构建阶段引用了CoreData.framework,并在AppDelegate中包含了必要的Core Data属性.

奇怪的是我在Finder中打开了.xcdatamodeld包来暴露内部.xcdatamodel(注意没有尾随'd').双击该文件将按预期使用Core Data Model Editor打开XCode.

甚至更奇怪的是,我创建了一个新的投影并点击了"使用核心数据"复选框.这样做允许我通过在Project Navigator中选择.xcdatamodeld引用来编辑数据模型.因此,我的机器和XCode能够并配置为编辑CoreData文件.

就好像XCode无法使用核心数据,除非原始项目是使用"使用核心数据"复选框创建的.

有没有人遇到过这个问题,你能解决它,以及如何解决?

谢谢!

Ada*_*uer 31

原来我试图将数据模型添加到一个组,该组引用了一个特定的文件夹来存储它的子项.但该文件夹不存在.这会导致XCode将数据模型放在项目根目录中,但同时将其引用为驻留在项目根目录上的2个目录.甚至更奇怪的是,XCode没有将文件显示为缺失,而是将其显示为红色.无论哪种方式,XCode在Project Navigator中单击时都会忽略该文件,因为它确实不存在于它认为的位置.故事的道德是:检查文件路径和配置的组路径.

  • 顺便说一句,这也意味着如果您尝试删除添加的模型,数据文件仍然存在 - 因为它具有该文件的错误路径.肯定是必须是Xcode错误 (3认同)

Cli*_*rum 29

我今天遇到了这个问题,问题是我的.xcdatamodel文件被打包在里面(奇怪,我知道).以下是我修复它的方法:

  1. File.xcdatamodel在Finder中找到了我的文件.
  2. 右键单击并选择" 显示包内容".
  3. 里面是另一个副本File.xcdatamodel.我把它复制到我的桌面.
  4. 然后我将该文件拖入Xcode并打开.

终于解脱了.:)我希望这有助于其他人.


Kev*_*ord 5

我们真正的问题是 Xcode 在创建新版本时无法打开/验证数据模型。含义:先有一个 .xcdatamodel,然后Editor > Add Model Version... > MyProject 2(如 .xcdatamodel)。之后,MyPoject.xcdatamodel d已创建,但无法打开。

经过几个小时的调查后,我们发现 .xcurrentversion 文件和XCVersionGroup项目文件中的 .xcurrentversion 文件丢失或无效。原因之一是 xcdatamodel d版本应该位于根文件夹中。

简单快速的解决方案1:

创建一个新的模型版本并:

  1. 设置根文件夹的路径
  2. 指定Group为先前版本所在的子目录。

新的 .xcdatamodel d现在可以在 Xcode 上运行,但不能移动到根文件夹以外的任何地方

复杂的解决方案2:

要在子文件夹中包含有效的 .xcdatamodel 您必须按照以下步骤手动修改项目文件:

PS:这是我写过的最复杂和最hacky的答案。对不起 :(

  1. 在先前版本的同一目录中创建一个新的模型版本(即使它会使数据模型无效)。
  2. 确保在您的目标中指定了新的 .xcdatamodel 文件
  3. 在 Finder 中打开包内容并将所有 xcdatamodel 版本拖放到项目中。
  4. project.pbxproj在文本编辑器中打开该文件。
  5. 搜索所有数据模型的新文件并复制其fileId.

例子:

75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel in Sources */ = {isa = PBXBuildFile; fileRef = 75F319981B9D80D50030FF46 /* MyProject 2.xcdatamodel */; };
// fileId = 75F3199D1B9D80D50030FF46 /* The first id at the beginning of the line */
Run Code Online (Sandbox Code Playgroud)
  1. 将这些行从该PBXBuildFile部分移动到该部分的开头PBXFileReference,然后像这样更新它们(重用fileId)。

例子:

75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MyProject 2.xcdatamodel"; sourceTree = "<group>"; };
Run Code Online (Sandbox Code Playgroud)
  1. MyPoject.xcdatamodeld现在在该部分中搜索文件PBXBuildFile并复制其fileRef.

例子:

75F319961B9D7FA50030FF46 /* MyProject.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 75F319931B9D7FA50030FF46 /* MyProject.xcdatamodeld */; };
// fileRef = 75F319931B9D7FA50030FF46
Run Code Online (Sandbox Code Playgroud)
  1. 最后,在文件的最后project.pbxproj创建该XCVersionGroup部分并重fileRef用 xcdatamodel d和 all中的fileId

示例(无//注释):

/* Begin XCVersionGroup section */
        75F319931B9D7FA50030FF46 /* MyProject.xcdatamodeld */ = { // fileRed
            isa = XCVersionGroup;
            children = (
                75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */, // fileId
                75F319A11B9D80D50030FF46 /* MyProject.xcdatamodel */, // fileId
            );
            currentVersion = 75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */; // fileId of the current version
            name = MyProject.xcdatamodeld;
            path = Path/To/MyProject.xcdatamodeld; // set the correct path
            sourceTree = "<group>";
            versionGroupType = wrapper.xcdatamodel;
        };
/* End XCVersionGroup section */
    };
    rootObject = 7564EB681B4AB1560065394B /* Project object */;
} /* EOF */
Run Code Online (Sandbox Code Playgroud)
  1. 您现在应该能够在 Xcode 中从所需的子文件夹中打开 xcdatamodel d文件。
  2. 现在从 xcode 中删除单个 xcdatamodel 文件的额外引用(在开始时创建的文件)。

抱歉回答太长...但问题已经解决了:D