ios - Xcode 更改未修改的 Storyboard和 XIB 文件

标签 ios xcode interface-builder storyboard xib

当多人协作时,从 git 工作流程的角度来看, Storyboard相当痛苦。例如,.storyboard 文件中的 XML 有其起始 <document>标签的 toolsVersionsystemVersion最近的文件操纵器碰巧运行的任何配置都会改变属性。精确同步每个人的 Xcode 版本似乎有助于 toolsVersion ,但是systemVersion无论如何都会发生变化,具体取决于开发人员运行的特定 Mac 和/或 OS X 版本。

这是愚蠢的,但基本上是无害的。然而,让我们担心的是,在其他时候,只需在 git pull 之后打开它们,就会自动对 Storyboard进行一些其他更改。 .也就是说,Alice 对 Storyboard 进行更改,提交并将它们推送到存储库。然后 Bob 提取 Alice 的更改并打开 Storyboard以进行进一步的更改。在他打开 Storyboard的那一刻,文件图标立即变为已修改但未保存的状态,并且显示 git status。显示发生了任何数量的奇怪变化。所有这一切都没有 Bob 更改任何内容或亲自保存文件。

我们看到的最常见的自动更改是整个 <classes> 的消失或重新出现。 Storyboard文件末尾附近的标记层次结构。我们还没有弄清楚是什么原因造成的。我们可能在不同的 .lproj 目录中有多个 Storyboard的本地化版本,当在 Interface Builder 中打开它们时,类层次结构可能会自发地从某些中删除并添加到其他中,或者在某些中单独保留。这会在 git diff 中引起大量噪音,但它实际上并没有破坏任何功能。我们通常会选择性地将我们所做的实际更改添加到 git 的索引中,提交这些更改,然后丢弃自发的、无意义的 <classes>。变化。这是为了保持提交小而漂亮,因为它们应该如此。但是,最终,由于 Xcode 不断重新进行更改,并且有人只是愤怒地将它们与其他一些东西一起提交,所以它变得太麻烦了……这很好,直到其他人的 Xcode 决定要将它们改回 no明显的原因。 (我们的提交历史对此有很多诅咒。)

还有其他人看到这种行为吗?这是我们的一台或多台开发人员 Mac 上的 Xcode 错误或配置问题吗?我们在与 XIB 文件协作时看到了一些类似的行为,但 Storyboard似乎更容易受到这种影响。

最佳答案

这不是错误,这是 Xcode 处理 Storyboard 文件的方式的结果。 我正在为 Storyboard文件编写差异和合并程序 (GitHub link)我花了几个小时分析 Storyboard文件逻辑以及 Xcode 如何处理它。这是我发现的:

  • 为什么 Storyboard文件会发生奇怪的变化? Xcode 使用 NSXML API 将 Storyboard文件解析为一些 NSSet基于逻辑树结构。当 Xcode 需要写入更改时,它会创建一个 NSXMLDocument根据逻辑树结构,清除 Storyboard文件并调用XMLDataWithOptions:再次填充文件。因为集合不保留其元素的顺序,所以即使是最轻微的修改也可能改变整个 Storyboard XML 文件。

  • 为什么类标签会随机消失或重新出现? <class> section 只不过是一个内部 Xcode 缓存。 Xcode 使用它来缓存有关类的信息。缓存经常变化。类 .h/.m 时添加元素当 Xcode 怀疑文件已过时(至少较旧的 Xcode 行为如此)时,文件将被打开和删除。保存 Storyboard时,缓存的当前 版本会被转储,这就是 <class> 的原因。部分经常更改甚至消失。

我没有对 Xcode 进行逆向工程;我通过试验 Xcode 和 Storyboard文件得出了这些观察结果。尽管如此,我几乎 100% 肯定它是这样工作的。

结论:

  • 缓存部分不重要;您可以安全地忽略其中的任何更改。
  • 与您在所有论坛上可以找到的内容相反,合并 Storyboard文件并不是一项复杂的任务。例如,假设您更改了 MyController1 Storyboard文档中的 View Controller 。打开 Storyboard文件,找到类似这样的东西 <viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”> . 您可以安全地只提交此部分中的更改,而忽略其他所有内容。如果你改变了 segues 或约束,也提交任何有 “ory-XY-OBM” 的东西里面。很简单!

关于ios - Xcode 更改未修改的 Storyboard和 XIB 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13233181/

相关文章:

ios - Cocoapods - 安装 Mapbox-iOS-SDK 时出错

xcode - 永远不会读取在其初始化期间存储的值

ios - 如何在不启动Xcode的情况下在iOS设备上启用开发人员模式

xcode - 傻瓜式界面生成器 : How to set an action to an UIBarButtonItem in Xcode 4?

ios - 如何让 UIView 在 Interface Builder 中显示其导航 Controller 的导航栏

xcode - 使用 Xcode 4 将 iPhone XIB 转换为 iPad 版本

ios - 侧栏菜单的滑动手势无法正常工作 - Swift

ios - 取消隐藏 UIStackView 元素时的动画方向

iphone - 导航堆栈中的 TableView 不会动画返回

ios - 使用不带 'ModuleName' 选项的 CocoaPods 时出现 No such module 'use_frameworks!' 错误