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.
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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ?
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
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
??? 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