如何复制故事板中设计的 UIView?

Posted

技术标签:

【中文标题】如何复制故事板中设计的 UIView?【英文标题】:How to duplicate an UIView designed in a storyboard? 【发布时间】:2014-08-22 11:54:51 【问题描述】:

所以我有一个我在故事板视图控制器中设计的视图,我想从代码中多次重用该设计。在 XCode 5 中可以做到这一点吗?如果是这样,你能告诉我正确的方向吗?

【问题讨论】:

【参考方案1】:

便宜的方法,给视图打个标签。

然后UIView *view = [UIView viewWithTag:tag];

然后继续复制它,将其添加到视图中。

或者试试这个:

id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];

请记住,并非所有内容都必须正确存档和取消存档(自定义字体、角半径等图层设置),并且应避免使用 IBOutlets,因为它们不会在克隆对象上得到更新。

【讨论】:

据我所知UIView 没有实现NSCopying 协议,所以像[view copy] 这样的东西将不起作用。知道如何复制视图而无需我创建一个方法吗? @MihaiFratu 试试这个:id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 归档视图...这很...有趣!它可以工作.. 性能可能不会太差... 似乎有一些错误,因为我在视图中的一个按钮丢失了它的自定义字体和角半径。这似乎有点懒惰,实际上您应该做一些事情,例如将视图移动到 nib 并多次实例化它而不是克隆它。 实际上,这可能是一个非常糟糕的主意。我在复制的视图上有一个 IBOutlet,只是花了很长时间试图弄清楚为什么我在该 IBOutlet 对象上调用的函数没有效果。这是因为 IBOutlet 仍然指向原始视图的对象,而不是新创建的对象... @CMash 是的,你得重做一些选择器。【参考方案2】:

你真正要问的是如何实现视图控制器多态。

这是一种常见的面向对象编程设计模式/原则。

如Wikipedia 所定义。

您可能会发现此SO Q&A 很有帮助。

本质上,您希望通过在父视图控制器中实现prepareForSegue 方法来设置某些目标视图控制器的公共属性。

【讨论】:

嗯...我想你错过了理解我的问题。我要做的就是复制一个使用 InterfaceBuilder 设计的视图,它是给定视图控制器的一部分。表格视图单元格之类的东西在表格视图中被重用...

以上是关于如何复制故事板中设计的 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在故事板或XIB中以编程方式分配uiview?

来自故事板的表格视图单元原型未初始化子视图

如何使故事板中的 UiView 尊重百分比[重复]

故事板中的重叠视图

故事板约束不影响自定义 UiView 大小

故事板中的自定义 UIView