为啥我在 xcode 6 beta 中得到“必须将自动调整大小掩码转换为约束才能拥有 _setHostsLayoutEngine:YES”

Posted

技术标签:

【中文标题】为啥我在 xcode 6 beta 中得到“必须将自动调整大小掩码转换为约束才能拥有 _setHostsLayoutEngine:YES”【英文标题】:why do i get "Must translate autoresizing mask into constraints to have _setHostsLayoutEngine:YES" in xcode 6 beta为什么我在 xcode 6 beta 中得到“必须将自动调整大小掩码转换为约束才能拥有 _setHostsLayoutEngine:YES” 【发布时间】:2014-06-14 06:19:37 【问题描述】:

我在 swift UITableViewController 中有以下代码,但我得到一个“必须将自动调整大小掩码转换为约束以在第二行出现 _setHostsLayoutEngine:YES 异常。我没有更改界面构建器中的任何设置(所以自动布局和大小类都检查了)。

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? 
    let cell:TodoItemCell = tableView.dequeueReusableCellWithIdentifier("TodoItemCell", forIndexPath: indexPath) as TodoItemCell
    let row = indexPath.row
    cell.titleLabel.text  = self.todoItems![row].title
    self.callback!(row)
    // Configure the cell...

    return cell

我做错了什么?

【问题讨论】:

有没有人对此有任何运气或更新? 我不小心在 Storyboard 中添加了 UITableViewCell 而不是 UITableView 【参考方案1】:

不确定这有多大帮助,但如果我尝试将单元格直接放在 UIView 而不是表格中,我会看到同样的错误。这适用于 Xcode 5,所以我怀疑这是 XCode6/ios8 的错误。同时,调试该方法并查看您的 tableView。确保它实际上具有您要检索的单元格的实例。

更新: 向 Apple 提交了错误报告,我可以确认这是 ios8 问题。不幸的是,它在 beta-5 中仍然存在,希望他们能在最终版本之前修复它。

【讨论】:

这在 Xcode 6 GM 中没有修复。我的问题是 xib 错误地在视图层次结构的中间有一个自定义类从 UITableViewCell 下降的视图。 我在 Xcode 6.0.1 上确认了这个问题。有什么解决方法吗?例如,在 UIView 中放置一行 UITableView 以托管 UITableViewCell? “有效”的唯一方法是禁用自动布局。这不是解决方案。所以我会回到 Xcode 5,直到它得到修复。 在 Xcode 6.3 和 iOS 8.3 中仍然是一个问题。这确实是我的问题——我直接在 UIView 中有一个 UITableViewCell(为了方便使用 Right Detail 样式)。我用两个标签替换了它。 如果苹果现在还没有解决这个问题,那么显然他们只是不把它视为优先事项。我对遇到此问题的任何人的建议是像我一样去提交错误报告。 Mabey,如果有足够多的人对此表示不满,他们就会看看。【参考方案2】:

这是不是错误,您根本不能使用UIView 作为表格视图的单元格,您必须确保 nib 文件中的***视图是 UITableViewCell

【讨论】:

很多 cmets 也提到禁用自动布局。在尺寸等级和多种屏幕分辨率的时代,这应该被视为有效选项。向@neevek +1 以获得正确的层次结构推荐。 我实际上同意,这很可能是它的预期工作方式。但是,尝试使用表格单元格来布局某些内容是许多用户的自然反应。 Apple 有责任更改编译器以防止此错误,或者至少记录一个单元格不能与表格分开使用的事实。 唯一对我有用的解决方案。非常感谢你。阅读上面的答案,我害怕认为我可能需要做出很多改变...... @ritesh_NITW,当这些答案被投票并且其中一个被标记为正确时,这甚至令人恐惧:-) 如果您在情节提要之外使用来自 xib 文件的自定义 uitablecells,这是正确的答案【参考方案3】:

我遇到了这个问题,因为我将单元格中 ContentViewLayout 属性更改为 Inferred (Constraints)。将其切换回Autoresizing Mask 解决了这个问题。

在 IOS 15 中,如果您将此设置设置错误,您的应用将崩溃

【讨论】:

伙计,你救了我的命,谢谢! 哇,这也拯救了我团队的培根。 我在升级到 Xcode 13 / iOS 15 时开始出现这个崩溃问题,这解决了它!【参考方案4】:

在我的例子中,我正在加载一个包含 UIView 的 UITableViewCell 的 nib 文件。在 nib 文件中禁用自动布局后,我再也没有遇到异常。

【讨论】:

是的,这对我有用...仔细检查情节提要中的类型【参考方案5】:

我也遇到了这个问题,这是由于 UITableViewCell 子类在 UITableView 之外的视图层次结构中使用,如其他答案中所述。在这种情况下,我的时间有限,因此我无法将该子类中的功能移动到 UIView 子类中。我想出的解决方法是在我的视图层次结构中创建一个UIView 实例,单元格应该在其中,并将单元格实例的视图层次结构移植到其中,然后从显示的视图层次结构中删除单元格本身。只要我将我移动的视图与单元格实例的各种属性保持联系,一切都会正常工作。

这有点 hacky,但它会保持运行,直到重构的时间可用。

【讨论】:

【参考方案6】:

iOS 15 / Xcode 13

.xib 文件有一个 NOT 嵌套在 UITableView 中的 UITableViewCell 时,我发生了这个崩溃。该单元格位于堆栈视图内 - 在某一时刻,它或多或少是一个占位符,因此某些界面警告会消失。我删除了孤立表视图单元格,并且不再出现崩溃。

【讨论】:

我刚刚更新到 Xcode 13 / iOS 15 并且遇到了同样的崩溃。我在 UITableViews 之外有 UITableViewCells,但它们都是各自 .xib 文件中的根视图,根据较旧的答案应该可以工作。根据您对这个问题的经验,似乎不再允许任何形式的孤立 UITableViewCells,即使是 .xib 根目录? 我的项目在 .xib 根目录下没有任何单元格,因此我不会对此有答案。对不起。【参考方案7】:

各位,这不是错误。正如下面从未说过的那样:

“这不是错误,您根本不能将 UIView 用作表格视图的单元格,您必须确保 nib 文件中的***视图是 UITableViewCell。”

我已经对其进行了测试,并且可以正常工作。

您需要创建 Xib 文件并删除它拥有的***视图。之后,将 UITableViewCell 拖放到 nib 中。这样就不会出现这个问题了。

【讨论】:

当你说 never 时,我猜你的意思是 neevek :-)【参考方案8】:

从 .xib 的属性中取消选择“使用自动布局”选项解决了我的问题。 - 发布我所做的,因为这可能对其他人有所帮助。

谢谢。

【讨论】:

这对我有帮助!非常感谢!【参考方案9】:

在我的情况下,我在 UIView 中使用 UITableViewCell 来创建自定义单元格

然后我从 UIView 中删除了单元格,然后直接添加了 UIView 中的所有内容,这解决了我的问题。

希望对你也有帮助。 万事如意

【讨论】:

【参考方案10】:

在我的情况下,我复制并粘贴了单元格,但缺少导致此错误的约束。 如果要将单元格复制到另一个 xib 文件中,请确保也复制了约束或再次创建它们

【讨论】:

【参考方案11】:

在 iOS15 / Xcode13 中,如果您无意中将自定义 UITableViewCell 类分配给不应该是 UITableViewCell 的东西,您可能会遇到此错误消息而导致崩溃。

就我而言,我不小心将TastingCardInstructionsUITableViewCell 的子类)应用于tastingCardInstructions 单元格和TastingCard,这是其层次结构中的一个视图(如下)。

TastingCard 是一个UIView,不是一个单元格,因此它不能继承UITableViewCell

这在升级到 Xcode13 之前构建并运行良好,但升级暴露了一个老错误。

【讨论】:

【参考方案12】:

就我而言,它要简单得多。使用 Xcode 12.5 完美运行,但在 13.1 中出现错误。 我在 contentView 中有 UITableViewCell 和一个额外的视图。额外的视图托管一个 StackView 并且像往常一样具有约束“推断(约束)”的默认设置。必须进行更改,因为现在约束被命名为“推断(自动调整掩码)”。类似于他们对 UIButton 所做的废话。 将“推断(约束)”更改为“自动调整掩码”解决了我的问题。

【讨论】:

【参考方案13】:

在我的例子中,UITableViewCell 父级是主视图,而不是 UITableView。在这种情况下,您只需将单元格放在表格视图中。

如果您将单元格拖到视图中而不考虑正确的层次结构,我认为这可能是一个常见问题。

【讨论】:

以上是关于为啥我在 xcode 6 beta 中得到“必须将自动调整大小掩码转换为约束才能拥有 _setHostsLayoutEngine:YES”的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Xcode 6 Beta 7 现在得到:文件 info.plist 无法打开,因为没有这样的文件

当我在 Xcode 6 beta 中尝试 Swift Playground 时出错

在 Xcode 6 beta 5 中使用“po”命令调试选定视图

Xcode 11 Beta 3 动画不再有效

在 Xcode 9 beta 5 中激活“焦点跟随选择”?

在 xcode 8 beta 6 的 UITableView 中使用 indexPath.row 将无法编译