如何避免Xcode对Storyboard文件进行不必要的编辑?

60
当我导航到我的xib文件之一时,Xcode将该文件标记为已触摸。 撤消和还原没有效果。 保存似乎没有危害,但故障会导致我频繁进行其他git工作。
有人看到过这种情况吗?或者对我的MainWindow.xib中可能引起此问题的内容有什么想法?
2019年编辑 - 问题仍然存在!

我在我的环境中没有看到那种行为。我想知道:可能是相关的xib文件最后一次在Xcode3中使用,而Xcode 4正在幕后进行一些转换吗?或者,每当您选择一个xib文件时,无论是第一次在Xcode4中选择还是不是,您都会看到这个问题吗?是否有任何git设置使您的文件只读,而Xcode更改权限以便您可以编辑它?这可能解释了修改状态。 - Mark Granoff
谢谢你的建议。该文件在xcode 3项目中。每次我导航到_那个文件_时都会出现问题。你的转换想法很好,但即使保存/构建后问题仍然存在。没有特殊的git设置。 - danh
2
以下是我可以复现此问题的最小步骤:xcode->新建文件...->用户界面->应用程序xib。拖动一个标签栏控制器。保存。选择项目中的任何其他文件。xcode会触及新的xib。将原始文件与xcode的修改进行比较,显示大量类似于此的标记:<reference key="NSWindow"/>和<reference key="IBUITabBar" ref="795333663"/>以及一个非常大的块,其开头如下:<object class="NSMutableArray" key="referencedPartialClassDescriptions">。这是我的错觉吗? - danh
哇,我按照你的步骤也看到了同样的行为。我想知道这是否特定于XIB文件是一个应用程序 XIB?你可以想象那个XIB对于像你的应用程序委托等事物有特殊的了解。这确实是奇怪的行为,毫无疑问。 - Mark Granoff
1
感谢您查看。我可以使用任何xib文件进行复制。关键似乎是存在UITabBarController。我向苹果报告了一个错误...错误编号为#9847336。 - danh
显示剩余3条评论
3个回答

31

苹果公司表示这是一个已知问题:

这是对Bug ID# 9847336的跟进。经过进一步调查,确定这是一个已知问题,目前正在由工程师进行调查。该问题已在我们的错误数据库中以原始Bug ID#9056156的形式进行记录。用于跟踪此重复问题的原始Bug编号可以在状态列中以以下格式找到:Duplicate/OrigBug#。


3
我无法理解苹果自己的开发人员为什么不会被激怒到现在已经修复了它。 - kwahn
1
我仍然可以在2013年10月的XCode 4.6.3中完全看到它! - Fattie
3
抱歉,您需要提供更多上下文信息才能准确地翻译这句话。 - cweekly
6
这件事情已经困扰我很长时间了!但直到今天我才决定谷歌一下。该死,这个漏洞一定很难解决。(xcode 6.4...) - Nuno Gonçalves
2
仍然在使用Xcode 8.2,使用XIB和故事板。2017年3月。 - QED
显示剩余9条评论

16

在尝试了许多不同的解决方案以解决这个极其恼人的错误后,我找到了一个可行的方法(它肯定不是“修复”,而是一种解决方法)。

完成控制器时锁定它们。

在Storyboard中选择视图控制器,打开Identity inspector,在Document部分的底部,您将看到一个锁定下拉框。从锁定下拉框中选择“All Properties”。

如果您为给您带来问题的所有控制器(甚至是所有控制器)都这样做,您会注意到当您打开Storyboard时,Xcode仍会修改各个元素的框架,但立即撤消更改。

然后导致开发周期:

  1. 解锁视图控制器
  2. 执行必要的更改
  3. 锁定视图控制器
  4. 提交

如果需要,锁定也适用于逐个查看。

该错误已经存在了相当长的时间,但似乎不会很快得到修复,因此现在只能这样了。


哦,天啊,我太激动了,终于找到了这个解决方法。这个错误已经困扰和让我沮丧了4个月了。可惜的是,如果我锁定视图控制器上的所有属性,Xcode 6.2就会崩溃。我甚至尝试将锁移到根视图下面,但每次仍然会崩溃。真糟糕。不过很高兴你已经解决了! - djibouti33

4
我个人认为知道这是一个已知的问题并不能完全解决这个问题。以下是我目前发现的情况以及如何避免出现这种情况。
注意:这适用于启用AutoLayout的storyboard。我还没有找到手动storyboard的解决方法。
下面是一个按钮的示例。
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ebd-ny-Ill">
    <rect key="frame" x="97" y="5" width="135" height="30"/>
    <color key="backgroundColor" white="0.94557291669999999" alpha="1" colorSpace="calibratedWhite"/>
    <constraints>
        <constraint firstAttribute="width" constant="86" id="bXV-mS-ksp">
            <variation key="heightClass=regular" constant="135"/>
        </constraint>
    </constraints>
    <fontDescription key="fontDescription" type="system" pointSize="13"/>
    <state key="normal" title="See Full Menu">
        <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
    </state>
    <variation key="default">
        <mask key="constraints">
            <exclude reference="bXV-mS-ksp"/>
        </mask>
    </variation>
    <variation key="heightClass=regular" misplaced="YES">
        <rect key="frame" x="97" y="5" width="135" height="28"/>
        <mask key="constraints">
            <include reference="bXV-mS-ksp"/>
        </mask>
    </variation>
    <connections>
        <action selector="showMenu:" destination="eQk-yf-uDh" eventType="touchUpInside" id="xOP-Se-FXQ"/>
    </connections>
</button>

如果您仔细观察,可以发现该按钮有一个名为<rect/>的元素。它定义了UI元素的大小和位置。如果向下看,还会看到一个名为<variation/>的元素,它描述了基于大小类别的位置变化。为了修复此位置,我们必须按照以下步骤操作:
  1. 查看在Xcode中显示的警告,并记录需要更改的UI元素。
  2. 使用外部(文本)编辑器打开storyboard。
  3. 在storyboard中找到UI元素。
  4. <rect/><variation/>中更改值以匹配警告提示。
  5. 在外部编辑器中保存文件。
  6. 返回到Xcode,让其重新计算所有约束。
  7. 接受再次弹出的UI元素警告。
  8. 如果返回到外部编辑器,您将注意到<variation/>元素已消失。
在我的例子中,我不得不将x="97"更新为x="597"
我仍在处理没有<variation/>的元素。我一旦解决了它,就会尽快更新这个答案。

Xcode 会随意编辑 ID 和其他内容,不仅仅是视图约束和位置。 - kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接