如何复制UILabel?

我有IBOutlet UILabel *label;

我想这样做

 UILabel *label = [titleLabel copy]; label.text = @"Clone"; titleLabel.text = @"Original"; NSLog(@"label : %@, title : %@",label.text,titleLabel.text); 

这抛出exception

*由于未捕获exception'NSInvalidArgumentException',原因:' – [UILabel copyWithZone:]:无法识别的select器发送到实例0x6a4a450'*终止应用程序*第一次抛出调用堆栈:(0x126f052 0x1823d0a 0x1270ced 0x11d5f00 0x11d5ce2 0x1271bd9 0x2ed6 0x1270e1a 0x2851 0x28264e 0x1e2a73 0x1e2ce2 0x1e2ea8 0x1e9d9a 0x24af 0x1ba9d6 0x1bb8a6 0x1ca743 0x1cb1f8 0x1beaa9 0x215cfa9 0x12431c5 0x11a8022 0x11a690a 0x11a5db4 0x11a5ccb 0x1bb2a7 0x1bca9b 0x21c2 0x2135)

没有公共的Apple API来深度复制UILabel。 你最好的办法是制作一个帮助你复制你所关心的所有部件的方法。

 - (UILabel *)deepLabelCopy:(UILabel *)label { UILabel *duplicateLabel = [[UILabel alloc] initWithFrame:label.frame]; duplicateLabel.text = label.text; duplicateLabel.textColor = label.textColor; // etc... anything else which is important to your ULabel return [duplicateLabel autorelease]; } 

如果你想在你的代码库中使用它,你可以把它改成一个静态方法,并把它放在某种工具类中。 如果你命名类LabelUtils你可以做一些像…

 + (UILabel *)deepLabelCopy(UILabel *)label { // ... } 

并将被调用使用UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];

我build议使用答案1和答案2的合并版本:

 - (UILabel *)copyLabel:(UILabel *)label { NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label]; UILabel* copy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; return copy; } 

然后只需使用类似的东西

 UILabel* labelcopy = [self copyLabel:originalLabel]; 

在你的代码中。

UILabel不符合NSCopying,所以你不能通过-copy复制。

但它符合NSCoding,所以你可以归档当前的实例,然后取消存档“复制”。

 NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label]; UILabel *labelCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 

之后,必须根据需要分配归档中未结转的其他任何属性(例如代理)。

Swift 3解决scheme

我将它创build为UILabel的扩展。

 extension UILabel { func createCopy() -> UILabel { let archivedData = NSKeyedArchiver.archivedData(withRootObject: self) return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel } } 

如何使用

 let anotherNameLabel = nameLabel.createCopy() 

附加信息 – 这是如何工作的?

NSKeyedArchiver将从内存中获取一个对象并将其转换为文本。 “键控”是指使用文字来描述该对象的属性,如“LabelFrame”,“LabelText”等(这些都是假键)。这也称为其他技术中的序列化。

NSKeyedUnarchiver则相反。 它将采取该文本,并build立一个对象。 在这里,我们把这个对象( Any? ),并将其转换为一个UILabel