如何解决storyboard合并冲突的噩梦(译)

原文

storyboard 的反对者们总是说

合并storyboard文件就是噩梦!

这么说也到没错。但幸运的是,有简单的办法来减少冲突的几率:

保持storyboard尽可能的小

这样做有以下几个好处:

  • 降低多个开发者编辑同一个文件的几率
  • 体积小的storyboard文件在xcode中渲染的更快(xcode是我永远的痛~~)
  • 减少编译时间(君不见一个巨型storyboard文件编译耗时将近一分钟!!)

你应该充分利用一个新特性:Storyboard References。如果你用不了,说明你还在支持iOS7,拜托,iOS11都快出了,还不升级留着过年么??

但是即便是再小的storyboard也依旧会发生冲突,可以通过以下几个步骤来快速解决:

场景

你的版本管理工具(git)报告了冲突亦或是当你想要打开一个storyboard文件时提示

The document “Main.storyboard” could not be opened. The operation couldn’t be completed. (com.apple.InterfaceBuilder error -1.)

编译失败。。。what the fuck!!

解决方案

并没有什么万金油(我的内心是崩溃的),有几个建议可供参考:

1.检查XML文件的语法

storyboard文件实质上就是一个巨型的XML文件,可以利用很多工具来检测语法的合法性,例如:

1
xmlLint Main.storyboard

2.检查明显的冲突

有些冲突非常明显的,很容易解决:

  • canvasLocation仅仅是确定元素在storyboard中的位置信息,大多时候都是无关紧要的
  • 多条相同的字体调用:
    1
    2
    3
    4
    <mutableArray key=”ProximaNova-Regular.otf”>
    <string>ProximaNova-Regular</string>
    <string>ProximaNova-Regular</string>
    ....

以上类似的问题以我的经验来看完全是so easy,你能以任何喜欢的方式解决。

  • 真正的冲突是类似于两个以上的开发人员编辑了同一条约束的值,这种情况唯一的解法只有自己沟通了。。

3.移除inferredMetricsTieBreakers

storyboard源文件的最后几行也是冲突出现的重灾区,就是叫inferredMetricsTieBreakers的地方

这些只是segue的标识的罗列,所以很难分辨出正确的版本。如果你的冲突出现在这部分或是你无法打开storyboard文件,别怕,把它们全删了就好了。。当你再次打开文件时这些信息会重新生成的~~

那么问题来了,inferredMetricsTieBreakers都是嘛玩意儿?
它们都是segues的引用,是用来解决多条segue指向同一个VC时候产生的simulated metrics冲突问题的。它们都是Interface Builder自动生成的,所以你大可不必担心~~

关于此处可参阅stackoverflow了解更多。

希望以上的内容可以为你节省一些时间,我也希望苹果能够在xcode8中能够对IB做出提升,以减少自身冲突的产生。(然鹅并没有。。)
就酱~~