Comment copier pour UILabel?
J'ai IBOutlet UILabel *label;
et je veux faire ce
UILabel *label = [titleLabel copy];
label.text = @"Clone";
titleLabel.text = @"Original";
NSLog(@"label : %@, title : %@",label.text,titleLabel.text);
et ce lancer exception
* Fin de l'app en raison de uncaught exception 'NSInvalidArgumentException', la raison: '-[UILabel copyWithZone:]: unrecognized sélecteur envoyé à l'instance 0x6a4a450'
* Premier lancer de pile d'appel:
(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)
source d'informationauteur Igor Bidiniuc
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de Pomme d'API de copie en profondeur un UILabel. Votre meilleur pari est de faire une méthode d'assistance que des copies de toutes les pièces qui vous intéressent.
Si vous voulez l'utiliser tous les dessus de votre base de code, vous pouvez le remplacer par une méthode statique et le mettre dans une sorte de classe utilitaire. Si vous avez nommé la classe
LabelUtils
vous pourriez faire quelque chose comme...et appelé à l'aide
UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];
Je recommande d'utiliser une nouvelle version de la Réponse 1 et la Réponse 2:
Puis il suffit d'utiliser quelque chose comme
dans votre code.
UILabel n'est pas conforme à NSCopying, de sorte que vous ne pouvez pas faire une copie par copie.
Mais il ne sont conformes à NSCoding, de sorte que vous pouvez archiver l'instance en cours, puis désarchiver une "copie".
Par la suite, vous aurez à affecter les propriétés supplémentaires qui n'étaient pas reportés dans l'archive (par exemple, le délégué).
Swift 3 Solution
Je l'ai créé comme une extension de la
UILabel
.Comment utiliser
Informations supplémentaires - Comment cela fonctionne?
NSKeyedArchiver
va prendre un objet à partir de la mémoire et de la convertir en texte. "Incrustée" signifie qu'il utilise des mots pour décrire les propriétés de cet objet, comme "LabelFrame", "LabelText", etc. (Ce sont de fausses clés.) Cela a également appelé la Sérialisation dans d'autres technologies.NSKeyedUnarchiver
fait le contraire. Il faudra que le texte et construire un objet. Ici, nous prenons un objet (Any?
) et de le convertir à uneUILabel
.