¿Cómo copyn UILabel?

Tengo la IBOutlet UILabel *label;

y quiero hacer esto

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

y esta exception de tiro

* Terminación de aplicación debido a exception no detectada 'NSInvalidArgumentException', razón: '- [UILabel copyWithZone:]: Selector no reconocido enviado a la instancia 0x6a4a450' * stack de llamadas primer tiro: (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)

No existe una API pública de Apple para copyr en profundidad una UILabel. Su mejor opción es hacer un método auxiliar que copie todas las partes que le interesan.

 - (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]; } 

Si desea usarlo en toda su base de código, puede cambiarlo a un método estático y ponerlo en algún tipo de class de utilidad. Si nombró a la class LabelUtils , podría hacer algo como …

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

y se llamaría usando UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];

Recomiendo usar una versión combinada de la Respuesta 1 y la Respuesta 2:

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

Entonces simplemente usa algo como

 UILabel* labelcopy = [self copyLabel:originalLabel]; 

en tu codigo

UILabel no se ajusta a NSCopying, por lo que no puede hacer una copy a través de -copy.

Pero sí se ajusta a NSCoding, por lo que puede archivar la instancia actual, luego desarchivar una 'copy'.

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

Posteriormente, deberá asignar cualquier propiedad adicional que no haya sido transferida en el file (por ejemplo, el delegado) según sea necesario.

Solución Swift 3

Lo creé como una extensión de UILabel .

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

Cómo utilizar

 let anotherNameLabel = nameLabel.createCopy() 

Información adicional – ¿Cómo funciona esto?

NSKeyedArchiver tomará un object de la memory y lo convertirá en text. "Keyed" significa que usa palabras para describir las properties de este object, como "LabelFrame", "LabelText", etc. (Estas son keys falsas). Esto también se denomina Serialización en otras tecnologías.

NSKeyedUnarchiver hace lo contrario. Tomará ese text y buildá un object. Aquí tomamos ese object ( Any? ) Y lo convertimos a un UILabel .