我们真正的问题是 Xcode 在创建新版本时无法打开/验证数据模型。含义:拥有第一个 .xcdatamodel,然后Editor > Add Model Version... > MyProject 2
(作为 .xcdatamodel)。之后,创建了 MyPoject.xcdatamodel d但无法打开。
经过数小时的调查,我们发现 .xcurrentversion 文件和XCVersionGroup
项目文件中的 .xcurrentversion 文件丢失或无效。原因之一是 xcdatamodel d版本应该在根文件夹中。
简单快速的解决方案1:
创建一个新的模型版本并:
- 设置根文件夹的路径
- 将 指定为
Group
先前版本所在的子目录。
新的 .xcdatamodel d现在可以在 Xcode 上工作,但不能移动到根文件夹以外的任何地方。
复杂的解决方案2:
要在子文件夹中有一个工作的 .xcdatamodel d,您必须按照以下步骤手动修改项目文件:
PS:这是我曾经写过的最复杂和最老套的答案。对不起 :(
- 在先前版本的同一目录中创建一个新的模型版本(即使它使数据模型无效)。
- 确保在您的目标中指定了新的 .xcdatamodel d文件。
- 在 Finder 中打开 Package Content 并将所有 xcdatamodel 版本拖放到项目中。
project.pbxproj
在文本编辑器中打开文件。
- 搜索所有数据模型的新文件并复制它们的
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 */
- 将这些行从该
PBXBuildFile
部分移动到该部分的开头PBXFileReference
并像这样更新它们(重用fileId
)。
例子:
75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MyProject 2.xcdatamodel"; sourceTree = "<group>"; };
- 现在搜索该
MyPoject.xcdatamodeld
部分中的文件PBXBuildFile
并复制其fileRef
.
例子:
75F319961B9D7FA50030FF46 /* MyProject.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 75F319931B9D7FA50030FF46 /* MyProject.xcdatamodeld */; };
// fileRef = 75F319931B9D7FA50030FF46
- 最后,在
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 */
- 您现在应该能够在 Xcode 中从所需的子文件夹打开 xcdatamodel d文件。
- 现在从 xcode 中删除单个 xcdatamodel 文件的额外引用(在开始时创建的那些)。
对不起,答案很长......但问题解决了:D