当我拖动它时,如何阻止Interface Builder在UIView中嵌入控件?

时间:2013-01-09 10:25:30

标签: ios xcode interface-builder

当我在Interface Builder中移动控件并传递UIView时。无论如何都要阻止IB将控件嵌入到UIView中并使其成为树层次结构中UIView的子级。

BEFORE
+UIView
+UIButton
+UIView

如果我用鼠标移动UIButton并将其置于UIView IB上方,将使其成为UIView的孩子

AFTER
+UIView
  +UIButton
+UIView

无论如何都要锁定底部视图。我经常将它们用作背景并对它们进行着色。

2 个答案:

答案 0 :(得分:3)

您可以在拖动元素的同时按住 Cmd ,而无需嵌入即可重新定位。

编辑:这只能用于Xcode 7。

答案 1 :(得分:0)

我放弃并决定所有控件组都应该有一个父UIView。可以是不可见的(clearColor的backgroundColor)

选择所有控件,然后选择编辑器菜单>嵌入视图。

之后我们可以安全地在他们自己的分组视图中移动它们,而不会跳过层次结构中的级别。

Embed in View的一个问题是使用标记和viewWithTag:

如果使用多个VC控制器和标记子视图构建视图,请确保标记ID在整个视图层次结构中是唯一的。

这是因为viewWithTag:只返回与id匹配的第一个控件,并且在向下移动一个级别继续搜索之前,似乎搜索ACROSS视图层次结构。

因此,如果您选择编辑菜单>嵌入视图您将控件向下移动到层次结构中的一个步骤。因此,对viewWithTag:999的调用之前可能已经拾取了您的控件,但现在可能会返回完全不同的控件。

它也可能崩溃! 将UIView的结果转换为控制例如UIImageView是很常见的 然后在控件上调用方法。 如果viewWithTag找到的控件不同于预期的控件,它甚至可能不是UIImageView,因此调用缺少的方法会抛出异常。

基本上从不使用标签,因为您必须在XIB和代码中进行调试,而不检查重复的ID。 从XIB拖动到.h并改为创建出口。

相关问题