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

2024-05-01

从 git 工作流程的角度来看,当多人协作时,故事板是一种巨大的痛苦。例如,.storyboard 文件中的 XML 有其起始位置<document> tag's toolsVersion and systemVersion属性由最新文件操纵器正在运行的任何配置更改。精确同步每个人的 Xcode 版本似乎有帮助toolsVersion, but systemVersion无论如何,都会发生变化,具体取决于开发人员运行的特定 Mac 和/或 OS X 版本。

这是愚蠢的,但基本上是无害的。然而,令我们担心的是,在其他时候,只需在故事板打开一段时间后,就会自动对故事板进行一些其他更改。git pull。也就是说,Alice 对故事板进行更改,提交并将其推送到存储库。然后,鲍勃提取爱丽丝的更改并打开故事板以进行进一步的更改。当他打开故事板时,文件图标立即变为已修改但未保存的状态,并且git status表明已经发生了许多奇怪的变化。所有这一切,鲍勃都没有更改任何内容或亲自保存文件。

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

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


这不是一个错误,这是 Xcode 处理故事板文件方式的结果。 我正在为故事板文件编写一个差异和合并程序(GitHub 链接) https://github.com/marcinolawski/StoryboardMerge我花了几个小时分析 Storyboard 文件逻辑以及 Xcode 如何处理它。这是我发现的:

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

  • 为什么类别标签会随机消失或重新出现? The <class>部分只不过是内部 Xcode 缓存。 Xcode 使用它来缓存有关类的信息。缓存经常变化。上课时添加元素.h/.m当 Xcode 怀疑文件已过时时,文件会被打开并删除(至少较旧的 Xcode 是这样的)。当您保存故事板时,current缓存的版本被转储,这就是为什么<class>部分经常发生变化甚至消失。

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

结论:

  • 缓存部分并不重要;您可以安全地忽略其中的任何更改。
  • 与您在所有论坛上找到的内容相反,合并故事板文件并不是一项复杂的任务。例如,假设您更改了MyController1故事板文档中的视图控制器。打开故事板文件,找到类似这样的内容<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>。 您可以安全地仅提交此部分中的更改并忽略其他所有内容。如果您更改了 Segues 或约束,也请提交任何已更改的内容“ory-XY-OBM”里面。简单的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xcode 更改未修改的 Storyboard 和 XIB 文件 的相关文章

随机推荐

  • 如何更改matplotlib注释中的箭头样式?

    我想更改注释中的箭头头 matplotlib 但与其他属性一起使用时不起作用 例如shrink 通过查看参数集 它似乎改变了创建的对象的类型 Example 以下代码显示了两种类型的注释箭头 import matplotlib pyplot
  • 设置 Size 属性时 Winform 不会调整大小

    我有一个用于托管 WebBrowser 控件的 WinForm 我想根据浏览器加载的文档大小动态调整表单大小 我可以从 WebBrowser 控件中成功读取文档大小 并根据该大小设置表单大小 但表单根本不会调整大小 调整大小是在 WebBr
  • ComponentResourceKey 作为 DynamicResource 问题

    我在使用 ComponentResourceKey 时发现一些意外行为 出现问题是因为我使用了 SystemColors 类中使用的名称 考虑以下代码 首先 我将 a 中的 ComponentResourceKey 公开为静态属性 publ
  • 未找到类规范化器(在 PHP 5.3.8 中)

    我在尝试使用时收到此 PHP 错误Normalizer类 特别是Normalizer normalize功能 Fatal error Class Normalizer not found 我目前使用的是 PHP 5 3 8 因此 根据PHP
  • 如何使用云 Firestore 实现 HIPAA 合规性? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须开发一个健康应用程序 想知道是否可以使用 Cloud Firestore 作为它的后端 任何人都可以对如何使我的系统符合 HIPAA
  • 使用 javaw.exe 启动应用程序时,不会执行关闭挂钩

    如果我使用 javaw exe 启动 Java 应用程序 则当用户从其 Windows 帐户注销时 不会执行关闭挂钩 该应用程序实际上是使用 launch4j 生成的 exe 文件启动的 但我知道它使用 javaw exe 来启动它 这似乎
  • Python 套接字库认为套接字未打开时已打开

    我正在使用一些Python 如下所示 HOST 127 0 0 1 PORT 43434 single socket socket socket AF INET socket SOCK STREAM try single bind HOST
  • WPF 中的自动展开树视图

    有没有办法在 WPF 中自动展开树视图中的所有节点 我搜索了 甚至没有在 treeview 属性中找到展开功能 Thanks 您可以设置 ItemContainerStyle 并使用 IsExpanded 属性
  • Python - 列出文件夹中的文件 - 带变量的路径名

    我对此非常陌生 我正在使用 python 我想列出多个不同文件夹中的文件 使用 Windows 在我的第一次尝试中 我有很多路径变量 每条路径都有自己的变量 它确实有效 但这似乎是一种冗长的做法 由于除了文件夹名称之外 路径均相同 因此我尝
  • 使用包含双引号的字符串填充输入字段

    我从服务器返回一个值 其中包含双引号 我需要用值填充输入标签 我尝试过使用 escape myVariable 但这会将空格转换为 20 等 我想我可以写一个 if then 来表示如果字段中有双引号 则使用 value 但是如果字段中同时
  • 如何访问 Go 中的嵌套模块(子模块)?

    去版本 1 12 9 这是一个简单演示项目的结构 所以我们有一个模块domain 其中包含两个模块 activity and person 我想将域与主文件中的所有嵌套模块一起使用 gt 模块 go 我知道如何导入domain主要在go m
  • SciKit-Learn 的分解模块中未安装 LatentDirichletAllocation

    我在 SciKit Learn 包中遇到了一些奇怪的问题 SciKit Learn 包内有 分解 模块 其中应包含 LatentDirichletAllocation 函数 请参阅此处的文档 https scikit learn org s
  • 根据机会创建销售订单时填充自定义字段

    我在 SO 屏幕 SO301000 上创建了一个自定义字段 联系人 现在 当用户从机会屏幕 CR304000 创建销售订单时 我需要填充这些字段 新的自定义字段联系人基于在机会中选择的客户 我可以看到 当我从机会创建销售订单时 客户会自动填
  • 带 webusb 的指纹扫描仪

    可以将 USB 指纹扫描仪与 webusb 连接 配对 https wicg github io webusb https wicg github io webusb 我有数字角色 U are U 4500 想要使用react js 连接到
  • 使用 Codename One 在 WebView 上实现 WebRTC

    我正在开发一个应用程序 我需要使用 Android 的 WebView 包含 WebRTC 根据这篇文章 https developer chrome com multidevice webview overview https devel
  • 使用 JSON 响应

    执行 ajax 请求后 我从服务器收到以下响应 error false success true 我的ajax代码 ajax url update type post data this serialize success function
  • HashSet 是否与 List 相同但具有唯一性?

    我需要有能力在收藏中拥有独特的物品 我打算使用字典 这样我就可以使用 ContainsKey 方法 但我认为这会很浪费 因为我不会使用键 值对的 Value 属性 我遇到了HashSet
  • 如何使表单仅位于应用程序的最顶层?

    我正在制作 Excel 插件 其中单击菜单项或工具栏按钮 打开表单 我已将窗体的最顶层设置为 true 但它仍然是 Windows XP 的所有应用程序的最顶层 我只需要保持 Microsoft Excel 的最高位置即可 我在 Visua
  • 如何在接收端打开没有 SSHD 的 shell?

    我有一台没有 SSHD 的机器 我想从远程机器 我可以完全控制 在这台机器上打开 bash shell 由于我的有限机器上有 SSH 因此我配置了反向代理 ssh R 19999 localhost 22 remoteuser remote
  • Xcode 更改未修改的 Storyboard 和 XIB 文件

    从 git 工作流程的角度来看 当多人协作时 故事板是一种巨大的痛苦 例如 storyboard 文件中的 XML 有其起始位置