在不从对象库中删除和添加的情况下将 UILabel 更改为 UITextView

Changing a UILable to UITextView with out removing and adding from the object library

是否可以在 Xcode 中将 UILabel 更改为 UITextView 而无需删除标签,然后添加文本视图。我想也许你可以更改 class 但它只能找到 UILabel.

假设我添加了 10 个标签,添加了所有约束,然后意识到我需要 textView。我可以通过某种方式更改对象 class 来更新 IB,而不是全部删除它们吗?

将情节提要编辑为简单 xml 是一个非常糟糕的主意。如果你想要文本视图而不是 UILabel 是因为你期望每个视图都有不同的行为,所以我认为最好的解决方案是删除文本视图并重新开始。

这是 IB 的一大烦恼。如果您在身份检查器中更改视图对象,它 有点 可以工作。问题在于IB中对象的属性是在第一次添加时设置的。 IB 将继续显示旧类型的设置。

如果您将视图更改为不同的类型,属性检查器中显示的属性和 IB 中的其他选项卡不会发生应有的变化。

另一方面,如果您删除以前的对象并添加新对象类型的实例,则您的约束、出口和操作都会丢失。

前几天我发现,如果我 select 在 IB 中编辑了一组对象并且 select "embed in view" 那么它会从新嵌入的对象中删除所有约束。哎呀!我有一组相当复杂的视图和控件,我设置了它们的布局和约束,以便它们看起来和调整大小正确,然后我意识到我需要将它们包含在视图中。在 selecting "embed in view" 之后,我又回到了起点,并且可能浪费了 15 或 20 分钟来再次正确设置约束。

虽然我同意其他关于在直接更改 XML 时谨慎使用的答案,但我发现有必要进行类似的更改,并且已经这样做,保持我的约束完好无损并且取得了成功。

确保您使用的是源代码管理,以便您可以在需要时放弃更改。

我建议使修改后的控件的属性与在界面生成器中创建的新类型的工作控件相匹配。

例子

要从标签更改为文本字段,您可以将 XML 中的 "label" 标记更改为 "textField."

<label opaque="NO" ... </label>

变成

<textField opaque:NO ... </textField>

其中“...”是控件的其余属性和元素。

元素标签更改完成后,修改元素的属性以将文本字段(在本例中)与在界面构建器中创建的另一个文本字段相匹配。注意不要更改 id 属性; id 属性是您的约束映射到控件的方式。

保存文件,然后在界面生成器中重新打开文件。如果 interface builder 可以解析该文件,那么您可以恢复正常开发。

再次提醒,谨慎使用,但这可以节省大量时间。