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.

Était-ce utile?

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

https://podcasts.apple.com / nous / podcast / iphone-application de programmation-printemps-2009 / id384233222

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top