为啥 Main.storyboard 中会出现内部不一致,我该如何解决?

Posted

技术标签:

【中文标题】为啥 Main.storyboard 中会出现内部不一致,我该如何解决?【英文标题】:Why do internal inconsistencies occur in Main.storyboard and how do I get around it?为什么 Main.storyboard 中会出现内部不一致,我该如何解决? 【发布时间】:2016-11-02 00:42:17 【问题描述】:

我在 Sierra macOS 上从 XCode 8 打开一个项目,该项目昨天正在运行,没有任何问题。 现在我明白了:

文档“Main.storyboard”有 2 个内部不一致 被发现并修复。这可能是由于 SCM 操作,例如 合并。请保存文档以修正不一致之处。

我无法单击其中任何一个按钮。他们不回应。 除了关闭项目,我什么也做不了。 我现在应该怎么做才能解决这个问题?

有人知道发生这种情况的原因吗?

【问题讨论】:

我已提交错误报告:29162925 谢谢,弗兰基。这是雷达://28339876 的欺骗,并且是 Xcode 8.1 中的一个已知回归,我们已经为 8.2 准备好修复(不幸的是,它不在 8.2 beta 1 中)。 @QuinnTaylor 考虑到这个问题的严重性,您可能希望在 Xcode 8.1.1 中发布修复程序。每次我想编辑我的故事板时,我都必须强制退出 Xcode,因为我无法摆脱这个对话框。 【参考方案1】:

我不敢相信我找到了答案……嗯,找到了解决这个可怕的事情的方法,这似乎是由 XCode 与内置源代码控制的交互引起的。

我不得不多次关闭 XCode 才能最终达到这个目的。我正在使用文本编辑器破解 main.storyboard 文件。我尝试了各种方法。

最后,我想了更多的错误信息。

原始消息中的“SCM”是什么?我猜是源代码控制模块,因为它提到了合并。

然后我注意到左侧列出了项目文件的 main.storyboard 文件旁边的大写“M”。它看起来像:

我猜那是在告诉我源代码控制说它是“修改”的,所以我右键单击 main.storyboard 文件并告诉它放弃更改。

如下所示:

在那之后,我能够再次打开故事板。 奇怪的是,有一次我什至能够在项目处于损坏状态时运行该项目。 费了好大劲才搞定。

XCode 开发人员必须解决这个问题。太可怕了。

编辑 2 啊!真是浪费时间。每次我再次查看情节提要时,SCM 都会合并一些内容,最后我确实看到了与错误有关的内容。看起来像:

哦,当然,这可能是我对 InterfaceBuilder 所做的事情,这都是我的错,但可怕的愚蠢的 XCode 让我这样做了。

编辑 3 好的,我注意到它认为标签都被拉长了。但是,自动执行此操作的是源代码管理合并。我想知道我的整个项目是否会成功?

编辑 4

我能够通过更多细节进一步解决这个问题,因此我想记录它们以帮助其他人。

部分根本原因

问题在于,由于某种未知原因,将特定标签放置在堆栈视图中时会变得疯狂并试图达到 9,000,0000,000 个单位的高度。

一种修复方法

快速浏览本文中的第二张图片。它显示了我右键单击 main.storyboard 文件的位置。当 Interface Builder 尝试渲染情节提要时,我实际上看到标签再次因巨大的高度而疯狂,然后我就能够

    选择使用外部编辑器打开 搜索违规大小(我搜索的是9,000,000) 更改文件的大小并保存,然后 Interface builder 会正确重新渲染。

冲突的约束

我还发现了一些有问题的相互冲突的约束,我解决了所有这些问题。在那之后,如果我将它复制到 StackView 中,我仍然会看到标签变得疯狂,但至少我可以通过在文本编辑器中编辑它来改变它。 祝你好运。

【讨论】:

这个有问题的大小可能没有 9,000,000 大。大于 10,000 的高度会导致同样的问题。查找大于 10,000 的高度的正则表达式: @tolpp 感谢您添加正则表达式。这是找到问题根源的好主意。【参考方案2】:

我遇到了同样的问题(5 个内部不一致),并找到了类似于 @daylight 的解决方案,但我认为我可以添加更多颜色。

首先-强调这是多么令人虚弱-我无法关闭对话框,因此无法更改情节提要中的任何内容来修复它-可怕的错误。

问题:

在 Xcode 8 上,Xcode 默默地大规模更改情节提要(可以通过 git 跟踪更改)。其中一些更改为堆栈视图中的标签添加了荒谬的高度(根据@daylight)。据推测,xCode 正在尝试 + 未能自动解决布局冲突。这些更改导致/与此问题中的对话框相关联,从而导致崩溃。

一旦 xcode 添加了这些更改,访问文件的唯一方法就是作为源打开。

Xcode 8 第一次打开情节提要 + 在它要求您选择查看设备之后,我能够以图形方式访问情节提要,这让我有机会检查它。

我无法通过简单地丢弃/修复更改来解决问题,因为 Xcode 会再次进行更改。

解决办法:

通过仔细跟踪 + 还原通过 git 所做的更改,并寻找疯狂的高高度数字,我能够在一个视图中将问题追溯到堆栈视图。我从这些堆栈视图中取出了所有内容(在我可以图形方式访问情节提要的那个短暂机会中)+删除了它们。问题解决了。现在我只需要重新格式化该视图,在我的情况下这不是太多的工作。

【讨论】:

@Phil-Ken-Sebben 似乎该错误的出现方式与我的相同——与 UIStackView 发疯有关。感谢您对此的关注。

以上是关于为啥 Main.storyboard 中会出现内部不一致,我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 ibtool 失败并出现 Main.storyboard 错误:shouldBeArchived 无法识别

Swift 删除 Main.storyboard 和 LaunchScreen.storyboard

为啥python中会出现这个AttributeError?

为啥 Eclipse 中会出现重复的方法建议?

为啥 Corona sdk 中会出现此错误?

为啥 SQL 结果中会出现重复值