我如何为 iOS 克隆/复制某种 UIView?
Posted
技术标签:
【中文标题】我如何为 iOS 克隆/复制某种 UIView?【英文标题】:How could I clone/duplicate some sort of UIView for iOS? 【发布时间】:2013-03-14 13:36:26 【问题描述】:(下面的屏幕截图有助于解释我要做什么)
这背后的想法是我有一个UIView
,里面有各种不同的UI
元素,例如,假设我有一个UIView
,里面有一个UILabel
。
现在我想复制UIView
(里面有标签)但不知何故,我可能需要对标签进行更改,例如更改文本属性。
我需要这样的东西的原因是,我可以构建 UIView
,其中包含我需要的一切看起来不错,但实际上具有不同的数据和不同的副本。
我不确定这是不是最好的方法,但这是我能想到的唯一方法。如果有人对如何做到这一点有任何想法,或者对更好的方法有任何想法,我将不胜感激。很多!
【问题讨论】:
【参考方案1】:我个人认为最好的答案是分别创建每个视图并根据需要进行配置。您可以创建一个方法,将新的 UIView 配置为看起来相同,然后通过它传递每个视图。
但是,如果你真的需要复制一个 UIView,你可以将它存档,然后再取消存档:
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
UIView *myView = (UIView *)copyOfView;
[self.view addSubview:myView];
如果您有很多这些,请确保您使用 Instruments 时间分析器来检查您的绘图效率。
【讨论】:
谢谢!似乎是一种很酷的方法,所以为了清楚起见,你的意思是我创建(和配置)我的视图,归档它,然后取消归档它?在存档视图时,您能否将我链接到资源或帮助我提供一些代码? 上面的代码正在执行归档和取消归档。注意在同一行中使用“NSKeyedArchiver”和“NSKeyedUnarchiver”。这是制作任何可归档对象的深层副本的规范方法。 啊,我明白了,是的,现在更有意义了!【参考方案2】:这是一件非常自然且有用的事情。您正在寻找的是一个容器视图控制器。将您的可重用“单元”放入它自己的视图控制器和它自己的 nib 文件中。然后,在您的父视图控制器中,使用addChildViewController:
添加任意数量的这些并配置它们中的每一个。它们每个都有自己的 IBOutlets,您可以使用它们来修改内容。
这与UITableView
和UITableViewCell
使用的模式非常相似(它没有专门使用“子视图控制器”,但确实使用了这种模式)。
有关详细信息,请参阅 ios 视图控制器编程指南中的 "Creating Custom Container View Controllers"。
请注意,Storyboard 在对象模板中包含一个“容器视图”作为选项,以使其更加容易。
如果您想要较低级别的访问权限,您也可以使用UINib
手动执行此操作以加载 nib 文件并连接其插座(这就是我们在 iOS 5 之前的做法),但今天我会使用子视图控制器。
【讨论】:
太棒了!我认为这是解决方案! :D 从设计的角度来看,如果它是一个带有标签的单元格,那么为它设置一个单独的视图控制器听起来有点矫枉过正(可能这就是 UITableView 不这样做的原因) 我认为我正在开发的最终产品将比UILabel
多一点。我可能需要其中几个,还有一个UIImage
,可能还需要一两个其他东西。【参考方案3】:
如果里面只有一个标签,显而易见的解决方案是创建一个自定义 UIView 子类,并将该标签添加为子视图。每次需要新视图时,您都可以创建自定义子类的实例并设置标签文本。如果您要设置多项内容,其中一些对于您的所有自定义子类视图都是通用的,您可以使用原型设计模式,这很容易实现。
【讨论】:
啊酷!是的,这听起来是一个很好的方法。没想到(对整个 iOS 来说还是新手)我想我会试试看的。以上是关于我如何为 iOS 克隆/复制某种 UIView?的主要内容,如果未能解决你的问题,请参考以下文章