如何在iOS中克隆/复制某种UIView?

5
下面的截图帮助解释我想做的事情。
这个想法是我有一个`UIView`,里面有各种不同的`UI`元素,例如,假设我有一个`UIView`,里面有一个`UILabel`。
现在我想复制`UIView`(里面包含标签),但是在此之后,我需要改变标签,例如改变文本属性。
我需要这样做的原因是我可以将`UIView`与所需的所有内容结构化,并使其看起来很好,但实际上具有不同的数据和副本。
我不确定这是最好的方法,但这是我能想到的唯一方法。如果有人对如何做到这一点或任何更好方法有任何想法,我会非常感激。
3个回答

7
我个人认为最好的方法是分别创建每个视图并根据需要进行配置。您可以编写一个仅配置新UIView外观的方法,并将每个视图传递给它。
但是,如果您真的需要复制UIView,可以对其进行归档,然后解档:
id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
UIView *myView = (UIView *)copyOfView;
[self.view addSubview:myView];

如果你有很多这样的东西,请确保使用Instruments时间分析器来检查你的绘图效率。


谢谢!看起来这是一个相当酷的方法,所以为了明确起见,您的意思是我创建(和配置)我的视图,将其存档,然后取消存档吗?此外,当涉及到存档视图时,您能否向我提供一些代码或链接资源帮助我? - Harry Lawrence
上面的代码同时执行归档和解档操作。请注意同一行中使用了“NSKeyedArchiver”和“NSKeyedUnarchiver”。这是制作任何可归档对象的深拷贝的规范方式。 - Rob Napier
啊,我明白了,是的,现在这样就更有意义了! - Harry Lawrence

6
这是一个非常自然和有用的事情。你要做的是创建一个容器视图控制器。将你可重用的“cell”放入自己的视图控制器和nib文件中。然后,在父视图控制器中使用addChildViewController:添加尽可能多的这些视图控制器,并对每个视图控制器进行配置。它们可以各自拥有自己的IBOutlets,您可以使用这些IBOutlets来修改其内容。
这与UITableViewUITableViewCell使用的模式非常相似(它没有专门使用“子视图控制器”,但确实使用了这种模式)。
有关完整详细信息,请参见iOS的View Controller编程指南中的“创建自定义容器视图控制器”
请注意,StoryBoard在对象模板中包含“容器视图”作为一种选项,以使此过程更加简单。
如果要获得更低级别的访问权限,也可以手动完成此操作,使用UINib加载nib文件并连接其IBOutlets(这是iOS 5之前的做法),但是今天我会使用子视图控制器。

太棒了!我觉得这就是解决方案!:D - Harry Lawrence
1
从设计角度来看,如果它只是一个带标签的单元格,为其单独创建一个视图控制器似乎有些过度设计(可能这就是UITableView没有这样做的原因)。 - Rad'Val
1
我认为对于我正在开发的最终产品,需要更多的东西而不仅仅是一个UILabel。我可能需要几个UILabel,一个UIImage,或许还需要其他一两个控件。 - Harry Lawrence

0

如果您只有一个标签,显而易见的解决方案是创建一个自定义的UIView子类,并将该标签添加为其子视图。每次需要新视图时,您都可以创建自定义子类的实例并设置标签文本。如果您有多个要设置的内容,其中一些是所有自定义子类视图共同拥有的,则可以使用原型设计模式,它非常容易实现。


哦,太酷了!是啊,这听起来像是一个很好的做法。我还没有想到过(对于整个iOS的东西还很新),我想我会尝试一下这个方法。 - Harry Lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接