如何获取从笔尖加载的UIView的多个副本?

时间:2010-05-07 14:53:54

标签: objective-c iphone interface-builder

我想多次使用UIView层次结构(nib对象是模板)。不幸的是,UIView不符合< NSCopying>所以

[cell.contentView addSubview: [[templEditCellView copy] autorelease]];

不起作用。

我并不感到惊讶,因为我想要一个视图层次结构的深层副本。

目前,视图是从中加载的nib中的几个顶级对象之一。有没有办法从笔尖重新加载单个指定的顶级对象?我应该将视图拆分为单个NIB,可以按需重新加载吗?或者有另一种方法来制作视图的深层副本吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

制作视图深层副本的最简单方法是归档和取消归档。

id copyOfAView = 
  [NSUnarchiver unarchiveObjectWithData:
    [NSArchiver archivedDataWithRootObject:aView]]; 

将视图放在自己的笔尖中也可以。您可以创建NSNib对象并根据需要重新加载它。

答案 1 :(得分:2)

您无法将其直接加载到单元格的内容视图中,但您可以创建一个包含视图出口的类并使用

加载它
[[NSBundle mainBundle] loadNibNamed:@"TheNib" owner:anObject options:nil];

有关于SO的更多信息以及关于从笔尖加载表格视图的网络。我非常喜欢Bill Dudney's方法,但Jeff LaMarche描述的方法对于很多情况来说都更容易和更好。

答案 2 :(得分:1)

目前这似乎对我的需求很有效:

if (! templEditCellView) {
  [[NSBundle mainBundle] loadNibNamed:@"TextEditCellView" owner:self options:nil];
  if (! templEditCellView) {
    abort(); // !!
  }
}
[cell.contentView addSubview: templEditCellView];
templEditCellView = nil;

在这种情况下,表控制器在每个单元格的内容中放置相同的自定义视图层次。

如果我有很多不同的单元格自定义(我可能),我很乐意看到一种不会增加nib文件的方法。