Comment appeler la fonction d'origine de la fonction surchargée dans une catégorie?
-
19-09-2019 - |
Question
Dans Objective-C, j'ai une catégorie pour une classe:
@interface UILabel(CustomInit)
- (id)initWithCoder:(NSCoder *)coder;
@end
Ce que je fais est d'écrire une fonction d'initialisation personnalisée qui fait des choses supplémentaires, et ce que je voudrais faire, est dans cette fonction d'initialisation personnalisée, appelez initWithCoder de base du UILabel. Est-ce possible? Comment?
EDIT
Merci. Ok, donc mes plans sans objet. Ne peut pas simplement surcharger initWithCoder. Est-il possible d'obtenir les mêmes fonctionnalités (où tous les UILabels obtenir cette étape d'initialisation ajoutée) sans surcharger initWithCoder? Ou est-il un exemple de code initWithCoder du UILabel que je peux peut-être tout simplement réécrire le code ajouté?
EDIT
Ok, donc d'être clair sur ce que je suis en train:
Puis-je intégrer une police personnalisée dans un iPhone demande
a une réponse dans laquelle quelqu'un ajoute manuellement une police personnalisée sur l'iPhone en utilisant la fonction GraphicServices privée GSFontAddFromFile. J'ai essayé ce code et il a très bien fonctionné pour régler manuellement la police d'une étiquette. Toutefois, si vous essayez de définir la police dans Interface Builder, il ne se charge pas correctement, il tombe juste en bas de la police du système. Ce que je voulais faire était de charger la police manuellement et définir la police de l'étiquette automatiquement avec la police choisie dans IB. De cette façon, je ne pas besoin de faire une prise pour chaque étiquette que je posai. Je n'ai pas aussi d'écrire une sous-classe de l'étiquette ridicule (qui a également été suggéré dans ce fil et fait une grande quantité de dessin personnalisé) que je trouvais plutôt grotesque. Maintenant, je pouvais encore faire une sous-classe pour toutes mes étiquettes, mais il y a le cas des étiquettes intégrées dans d'autres objets de l'interface utilisateur, soit UIButtons. Je voudrais les étiquettes intégrées aussi ne pas être brisés.
Toute suggestion serait grande. Merci.
La solution 2
Comment les gars vous sentez-vous à ce sujet?
Saisissez l'adresse de la méthode originale pour initWithCoder lors de l'exécution et le stocker dans une variable statique. Faites une méthode swizzle sur pour remplacer les classes mise en œuvre avec le mon initWithCoder. Et puis dans mon initWithCoder, je qualifierais la méthode originale stockée dans la variable statique.
Vous pouvez le mettre dans une catégorie et appeler cette étape d'initialisation de classe au début du programme, en vous assurant qu'il ne peut pas être appelé deux fois, ou si elle est elle ne fait rien.
Il semble dangereux, mais je me sens comme cela devrait fonctionner.
Autres conseils
De Mac OS X Reference Library :
Lorsqu'une catégorie un hérité méthode , la méthode dans la catégorie peut, comme d'habitude, invoquer l'héritage la mise en œuvre par un message au super. Toutefois, si une catégorie l'emporte sur une méthode qui existait déjà dans la la classe de catégorie , il n'y a aucun moyen de invoquer la mise en œuvre d'origine.
Méthode swizzling devrait fonctionner comme kidnamedlox suggéré.
Votre exactement la même question a été discutée dans cette classe itunes Stanford par Evan Doll