How do copy for UILabel?
There is no public Apple API to deep copy a UILabel. Your best bet is to make a helper method which copies all the parts you care about.
- (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];
}
If you want to use it all over your code base you can change it to a static method and put it in some sort of utility class. If you named the class LabelUtils
you could do something like...
+ (UILabel *)deepLabelCopy(UILabel *)label {
// ...
}
and would be called using UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];
I recommend using a merged version of Answer 1 and Answer 2:
- (UILabel *)copyLabel:(UILabel *)label {
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
UILabel* copy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
return copy;
}
Then simply use something like
UILabel* labelcopy = [self copyLabel:originalLabel];
in your code.
UILabel does not conform to NSCopying, so you cannot make a copy via -copy.
But it does conform to NSCoding, so you can archive the current instance, then unarchive a 'copy'.
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
UILabel *labelCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
Afterwards, you'll have to assign any additional properties that weren't carried over in the archive (e.g. the delegate) as necessary.