Interface Builder&故事板:将Autolayout错误视为构建错误

时间:2016-02-11 21:17:13

标签: xcode autolayout interface-builder xcode-storyboard build-error

有没有办法将Interface Builder 冲突约束错误传播到构建过程的其余部分并将其视为构建错误?

当然,LLVM设置Treat Warnings as Errors对Storyboard错误没有影响。

我有这个观点,显然不能满足所有约束:

can't satisfy all constraints

在Interface Builder中:
这些错误看起来像这样:

  

冲突的制约因素
  无法满足所有约束条件。

enter image description here

在Xcode项目中:
错误被降级为警告,以便应用程序编译,构建,链接和运行。

enter image description here

如果界面生成器中的故事板中出现AutoLayout错误,如何阻止应用程序构建?

2 个答案:

答案 0 :(得分:1)

如果不是一个完整的解决方案,可以采取一些途径进行调查。

首先,请注意自动布局错误/警告有两个主要来源 - unsatisfiable constraintsambiguous constraints - 并且它们会以不同方式处理。

另请注意,自动布局的全部功能只能在运行时执行 - Xcode的工具可以深入了解故事板中约束的内容,但这与在这些约束中评估这些约束的情况有所不同。在应用程序中运行的“真实”视图/窗口。 (引用中的“真实”因为iOS模拟器适合布局调试......它不一定是真正的设备。)

使用ibtool

杀死构建版本

当Xcode“编译”您的故事板作为构建项目的一部分时,它会将该功能委托给命令行程序ibtool。虽然似乎没有办法改变Xcode解释ibtool输出的方式(即,将ibtool输出的错误视为停止构建的原因),但您可以调用{{1你自己多加一点时间。

  1. 添加自定义构建阶段或构建规则
  2. 在该阶段/规则的shell脚本中,调用ibtool来处理您的故事板。通过ibtool--warning获取警告或错误输出。 (查看正常构建的构建日志,和/或--error以查看您可能需要的其他标志。)
  3. 如果您检测到指示问题的输出(即非空输出,如果您自己设置为仅接收错误),则man ibtool您的shell脚本具有非零状态代码,并且Xcode将停止建立。
  4. 自动化构建后的约束调试

    如上所述,当您的应用运行时,实际的约束测试是在真实的布局情况下。因此,捕捉约束问题的最佳时机可能不是 build 自动化的一部分,而是测试自动化。

    • 对于不明确的布局,您可以使用exit上的hasAmbiguousLayout属性在运行时轻松检测到事物。如果你有一个布尔属性,你可以在运行时查询,你可以将一些东西放到自动化测试中。只需编写一些通过应用程序UI运行的单元测试,对重要视图进行测试UIView,并在该属性为真时失败。然后你的持续集成系统可以告诉你每当有人进行仍然构建的提交时,但会破坏提交后的单元测试。

    • 对于不满意的布局,可能会有点棘手。 Auto Layout系统在检测到此类问题时会自动登录到控制台,因此您可以为CI系统编写一个脚本,该脚本在单元测试的运行日志中查找“无法同时满足约束”。或者......我不确定在通过CI执行测试时是否可以使用特定的Xcode调试器断点运行,但如果是,则可以在hasAmbiguousLayout上设置符号断点。

答案 1 :(得分:0)

⚠️免责声明:以下解决方案不再适用于Xcode 9.2。

使用ibtool

杀死构建

根据@rickster

的建议提出运行脚本阶段
for FILE in `find ${SRCROOT} -name *.storyboard`
do
    IBERROR="`ibtool --errors --warnings --notices --output-format human-readable-text --enable-auto-layout --update-frames $FILE`"
    if [ -n "$IBERROR" ]; then
        echo "${IBERROR}"
        exit 1
    fi
done
exit 0

将以上脚本添加到 Build Phases 部分。