【问题标题】:Interface Builder & Storyboard: treat Autolayout errors as build errorsInterface Builder & Storyboard:将自动布局错误视为构建错误
【发布时间】:2016-02-11 21:17:12
【问题描述】:

有没有办法将 Interface Builder Conflicting Constraints 错误传播到构建过程的其余部分并将它们视为构建错误?

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

我的观点显然不能满足所有约束:


在界面生成器中:
这些错误如下所示:

冲突的约束
无法满足所有约束。


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

如果我在 Interface Builder 的 Storyboard 中出现 AutoLayout 错误,如何阻止应用程序构建?

【问题讨论】:

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


    【解决方案1】:

    如果不是一个完整的解决方案,这里有一些调查途径。

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

    另外请注意,自动布局的全部功能只能在运行时使用——Xcode 的工具提供了一些关于情节提要中的约束发生了什么的洞察,但这与在在应用程序中运行的“真实”视图/窗口。 (引号中的“真实”是因为 iOS 模拟器非常适合布局调试......它不必是 真实 设备。)

    使用ibtool 终止构建

    当 Xcode “编译”您的故事板作为构建项目的一部分时,它将该功能委托给命令行程序 ibtool。虽然似乎没有办法改变 Xcode 解释ibtool 输出的方式(也就是说,将ibtool 输出的错误视为停止构建的理由),但您可以自己调用ibtool 额外时间.

    1. 添加自定义构建阶段或构建规则
    2. 在该阶段/规则的 shell 脚本中,调用 ibtool 来处理您的故事板。传递--warning--error 以获得警告或错误输出。 (查看构建日志以了解正常构建,和/或man ibtool 了解您可能需要的其他标志。)
    3. 如果您检测到表示问题的输出(即非空输出,如果您将自己设置为只接收错误),exit 您的 shell 脚本会显示非零状态码,Xcode 将停止构建。

    构建后自动化约束调试

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

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

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

    【讨论】:

    • 我正在使用 Xcode 8 并试图让它工作但无济于事。我创建了一个带有 3 个不同警告的故事板:不明确的布局、错位的视图和不受支持的配置。但是,运行 ibtool --warnings --errors --notices --target-device iphone --minimum-deployment-target 9.0 --enable-auto-layout MisplacedView/Base.lproj/Main.storyboard 不会打印任何错误或警告。我得到的只是一个带有 3 个键的 plist,每个键都有一个空的 <dict/> 条目。 Xcode 中也出现了同样的错误。有什么技巧吗?我尝试了--compile 和其他我能想到的选项。
    【解决方案2】:

    ⚠️ 免责声明:以下解决方案不再适用于 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 部分。

    【讨论】:

    • 根据man ibtool:>--write指定的输出文档中所有错位的对象都受此选项影响。
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多