9
votes

Comment utiliser les catégories Objective-C

Lorsque vous implémentez une catégorie d'une classe dans un fichier, toutes les instances de cette classe seront de la catégorie par défaut?

Je suis nouveau à Objective-C et j'essaie de faire mon OffreTextView non sélectionnable. Je suis tombé sur cette réponse en utilisant une catégorie: https://stackoverflow.com/a/8013538/1533240 p>

Quelle est la solution suivante: P>

@implementation UITextView (DisableCopyPaste)

-(BOOL) canBecomeFirstResponder
{
    return NO;
}
@end


3 commentaires

Veuillez éditer votre question pour décrire «mais cela ne semble pas fonctionner.» plus précisement.


@Joshcaswell désolé! fait un peu plus clair


Il peut ne pas répondre à votre question, mais ma réponse ici peut vous donner une meilleure compréhension de Objective-C Catégories Stackoverflow.com/Questtions/12260729/...


3 Réponses :


20
votes

Vous avez mal compris le point de catégories. Catégories Ajouter des méthodes à une classe existante. Ils ne doivent jamais être utilisés pour remplacer les méthodes existantes. Ce faisant est un comportement indéfini (techniquement non défini dans un cas, mais vous ne pouvez pas prédire ce cas, vous devez donc supposer que cela s'applique).

Si vous devez remplacer les méthodes, vous devez sous-classe, ne pas utiliser de catégories. Voir la meilleure réponse à la question que vous avez liée.


1 commentaires

Ah d'accord. Merci! J'essayais juste de voir si je peux m'éloigner de ne pas faire une nouvelle classe et que cette réponse est une bonne réponse, je voulais l'essayer. = P merci beaucoup pour la perspicacité! Je vais probablement utiliser une sous-classe alors.



0
votes

Ce que vous devez faire est de déclarer catégorie dans l'en-tête .h fichier:

tel que: xxx

Ensuite dans .m définir comme xxx

Vous pouvez faire deux choses,

  1. Vous pouvez l'écrire dans une classe et importer cela pour toutes les classes dont vous avez besoin de cette fonctionnalité.
  2. ou écrivez ces lignes chaque .h et .m (respectivement), vous en avez besoin.

1 commentaires

L'interface n'est pas nécessaire, car cette catégorie est prime (en réalité, clowbering) une méthode existante.



6
votes

Lorsque vous implémentez une catégorie d'une classe dans un fichier, tous les Les instances de cette classe soient de la catégorie par défaut?

oui. Si vous créez une catégorie, Les méthodes de cette catégorie sont ajoutées à la classe . Par exemple, si vous créez une catégorie sur Nstring qui renvoie la somme de contrôle d'une chaîne, vous pouvez utiliser cette méthode sur toute instance de Nstring.

J'ai ajouté l'extrait de mon code, mais cela ne semble pas fonctionner dans ce cas, je peux toujours sélectionner le texte.

n'utilise pas de catégories pour remplacer les méthodes existantes.

Pour une chose, c'est une mauvaise forme. Vous êtes efficacement changer le comportement de la classe d'une manière que l'auteur ne s'attendait pas. Pour une autre chose, vous ne pouvez pas compter sur le dérogation au travail - l'ordre dans lequel les catégories sont ajoutées aux classes n'est pas définie, de sorte que vous ne savez jamais si certains les autres peuvent venir et remplacer la méthode que vous avez essayée de remplacer. C'est tout simplement pas fiable. Si vous devez remplacer les méthodes, créez une sous-classe à la place.


0 commentaires