De la bonne pratique des Categories

Bonjour à  tous,

Je connais le système des catégories depuis un bon moment, fort heureusement. Mais depuis iOS, j'en créée énormément.
Aujourd'hui, vient à  mon esprit une question qui semble être assez bonne, dont la réponse semble évidente.
J'ai créé une category de UINavigationBar car je souhaite la customiser dans tout mon projet.
La bonne pratique pour ce genre de chose est bien entendu de sous-classer UINavigationBar et de surcharger le drawRect: afin d'y dessiner ma navBar comme je le souhaite.
Cependant, je me suis vite heurté à  un problème majeur: cela impliquait de devoir créer un XIB pour chaque UINavigationController afin d'assigner ma sous-classe comme étant la classe de sa navigationBar.
Ainsi, je tenté de tourner ça en category et de voir ce que donnerait de surcharger le drawRect:.. ça fonctionne, mais est-ce une bonne pratique ? J'en doute très fortement étant donné que cela impact toutes les navBar du projet. Mais qu'importe, puisque c'est mon but.

J'ai bien entendu cherché à  créer une sous-classe de UINavigationController directement, mais me suis vite ravisé étant donné qu'on ne sait pas qu'il fait exactement au moment du loadView (il n'a pas que la vue principale à  créer, mais aussi la navBar voir même une toolbar).

J'aimerai donc avoir votre avis là  dessus.. si vous auriez fait pareil que moi au final, ou si il y a un meilleur moyen sans devoir créer un XIB supplémentaire.

Réponses

  • muqaddarmuqaddar Administrateur
    14:57 modifié #2
    Cependant, je me suis vite heurté à  un problème majeur: cela impliquait de devoir créer un XIB pour chaque UINavigationController afin d'assigner ma sous-classe comme étant la classe de sa navigationBar.


    Et alors c'est quoi le problème ?
    On a souvent 2 ou 3 navigationController max par appli... Tu n'as pas de XIB pour eux ? Tu fais tout par le code ?
  • AliGatorAliGator Membre, Modérateur
    avril 2011 modifié #3
    dans 1302002993:

    Bonjour à  tous,

    Je connais le système des catégories depuis un bon moment, fort heureusement. Mais depuis iOS, j'en créée énormément.
    Aujourd'hui, vient à  mon esprit une question qui semble être assez bonne, dont la réponse semble évidente.
    J'ai créé une category de UINavigationBar car je souhaite la customiser dans tout mon projet.
    La bonne pratique pour ce genre de chose est bien entendu de sous-classer UINavigationBar et de surcharger le drawRect: afin d'y dessiner ma navBar comme je le souhaite.
    Cependant, je me suis vite heurté à  un problème majeur: cela impliquait de devoir créer un XIB pour chaque UINavigationController afin d'assigner ma sous-classe comme étant la classe de sa navigationBar.
    Ainsi, je tenté de tourner ça en category et de voir ce que donnerait de surcharger le drawRect:.. ça fonctionne, mais est-ce une bonne pratique ? J'en doute très fortement étant donné que cela impact toutes les navBar du projet. Mais qu'importe, puisque c'est mon but.
    Non c'est clairement pas la bonne pratique que de passer par des catégories. Le fait de surcharger une méthode existante dans une catégorie est une très mauvaise pratique qui peut avoir des effets de bord (dont j'ai déjà  parlé dans d'autres posts il me semble). Les catégories ne doivent être utilisées que pour rajouter des méthodes non encore existantes à  des classes, pas pour surcharger des méthodes existantes de classes existantes car cela ne marchera pas à  tous les coups (j'ai déjà  eu des déboires selon les versions de l'OS et selon le bon vouloir du loader qui chargeait tantôt ma catégorie d'abord, tantôt la classe d'abord)

    La bonne réponse pour ce genre de problème c'est le method swizzling. C'est fait pour ça. (Ou le Class Posing, mais c'est deprecated depuis quelques versions de l'OS). J'en parlerai d'ailleurs brièvement lors de la prochaine session CocoaHeads à  Rennes
  • avril 2011 modifié #4
    Ah oui merci pour le method swizzling que j'avais totalement zappé ;)
    Il faut dire que jusqu'à  présent je n'en avait pas trouvé l'utilité.
    Je viens d'implémenter ça et ça marche du tonnerre
  • tabliertablier Membre
    avril 2011 modifié #5
    Etes-vous bien sur que les méthodes swizzling et Posing soient dans un framework commun aux deux mondes? Par contre les catégories, ça doit exister partout!
      ???  Je ne trouve pas de swizzling et Posing dans la doc!
  • zoczoc Membre
    avril 2011 modifié #6
    dans 1302532969:

    Etes-vous bien sur que les méthodes swizzling et Posing soient dans un framework commun aux deux mondes? Par contre les catégories, ça doit exister partout!
      ???  Je ne trouve pas de swizzling et Posing dans la doc!

    Le swizzling s'effectue à  l'aide des fonctions C fournies directement par le runtime objective-C. Il est donc commun aux 2 mondes (car le runtime est le même).


    Ceci dit, la documentation ne va pas très loin sur ces fonctions, et en tout cas elle ne présente pas spécifiquement le swizzling (tout du moins pas sous ce terme). Quant au Posing, il n'est tout simplement plus supporté. Normal, donc de ne rien trouver dans la documentation en cherchant spécifiquement ces mots.


    Google est bien plus prolifique sur ce point: (par ex.) http://www.cocoadev.com/index.pl?MethodSwizzling


  • tabliertablier Membre
    14:57 modifié #7
    Ok, Merci. Je vais jeter un oe“il!  (un seul bien sur  ;)  ).
Connectez-vous ou Inscrivez-vous pour répondre.