Dans une application iPhone, j'ai besoin de personnaliser l'apparence d'une classe UINavigationController. Par exemple, augmentez la taille de la barre et de la police. Mon client a vraiment besoin de cela, et de plus gros boutons aussi. Donc, au lieu d'écrire la classe de zéro, j'ai décidé de sous-classer UINavigationController. Ma question est, puis-je personnaliser la valeur par défaut d'une méthode ou d'un attribut? Y a-t-il des restrictions lors du sous-classement d'une classe?Jusqu'où pouvez-vous aller en utilisant la sous-classe dans l'objectif-c?
Répondre
Cela dépend de ce que vous entendez par "restriction". L'exécution ne vous empêchera pas de sous-classer ce que vous voulez, mais il y a quelques pièges. (Bien que votre réponse est précisément sur UINavigationController, le titre et le concept sont plus grandes, donc je vais aborder les questions plus importantes.)
- Il peut y avoir des variables dans la classe parente qui sont marqués
@private
et les classes d'enfants ne peuvent pas accéder, par rapport à la valeur par défaut de@protected
, qui sont accessibles. - Certaines classes sont conçues pour la sous-classe (et la plupart des classes AppKit et UIKit le sont), mais pour d'autres, c'est extrêmement imprudent. Par exemple, les classes de base clés comme NSString, NSMutableArray, etc. sont en fait des clusters de classe, ce qui signifie qu'une instance de la classe peut en fait être l'une des classes privées.
- Les classes conçues pour le sous-classement documentent généralement les principales méthodes qui doivent être remplacées. Par exemple, NSDictionary et NSMutableDictionary décrivent quelques méthodes "primitives" auxquelles toutes les autres méthodes appellent, donc le remplacement de 2 ou 3 dans chaque cas est suffisant pour changer le comportement sans ré-implémenter tout le reste.
- Soyez extrêmement prudent d'appeler l'implémentation de la classe parent de votre méthode substituée si et quand cela est nécessaire. Cela peut être particulièrement important dans les classes d'interface utilisateur, qui ont souvent un comportement plus complexe que les simples classes de données get/set.
Dans ce cas, vous avez tout à fait raison de ne pas écrire la classe à partir de zéro - ce serait une mauvaise idée ™. Si vous souhaitez modifier la valeur par défaut d'un attribut (champ?), Vous pouvez définir la valeur souhaitée dans un initialiseur après en appelant l'initialiseur du parent. Cependant, si vous faites cela, assurez-vous de ne pas arroser quelque chose dans la classe parente, et testez toujours soigneusement.
Apple a réservé des méthodes qui commencent par "_" pour leur propre usage, donc je ferais écho à la prudence de Marc de ne pas les toucher du tout. Tout le reste est juste jeu, dans la raison bien sûr. :-)
Non, n'hésitez pas à devenir fou. De nombreuses classes Cocoa ne sont pas aussi conviviales que les autres (en particulier celles qui sont censées dépendre davantage du contrôle des délégués) et peuvent ne pas exposer les fonctionnalités dont vous avez besoin, mais vous pouvez sous-classer toute méthode qui n'est pas privée (commence par _ préfixe). Vous pourriez même les sous-classer si vous le vouliez vraiment, bien que sur iPhone il y ait des chances qu'Apple rejette votre application.
- 1. comment aller au nouveau contrôleur de vue en utilisant UIWindow?
- 2. aller à la piste, puis tar?
- 3. aller au caractère dans vim
- 4. Global "Aller à la définition" dans vim pour Ruby?
- 5. En utilisant SMO, toujours pas aller ... ConnectionContext.ExecuteNonQuery (script) ne peut pas comprendre "GO"
- 6. En utilisant preg_split pour aller de « salut comment allez-vous » à [Salut, comment vas-tu]
- 7. Aller à Model/View/Controller dans emacs
- 8. Existe-t-il une commande pour aller à la fin (ou au début) d'un bloc Ruby en utilisant vim
- 9. Où devrait aller ma méthode?
- 10. AOP et imbriqué aller chercher
- 11. NHibernate plusieurs-à-aller aller chercher le même article plusieurs fois
- 12. comment aller à l'écran précédent
- 13. Response.redirect on Popup pour aller à la page principale
- 14. jQuery UI Datepicker aller à la date URL
- 15. Aller à l'article de la liste en tapant les premiers caractères
- 16. Où puis-je aller d'ici - en ce qui concerne la programmation?
- 17. VS08: Aller au début du 'bloc'
- 18. comment est-ce que je peux aller chercher la valeur de zone de liste déroulante dans mon DAO en utilisant des entretoises 2?
- 19. où signalerait le code de génération aller.
- 20. De MySQL, aller à Oracle: les pièges
- 21. en utilisant la bibliothèque fpdf
- 22. expliquer la commande en utilisant
- 23. comment analyser les données en utilisant la demande ASIHttp?
- 24. Word vba - Appuyez sur l'onglet pour aller au signet?
- 25. C# aller chercher une portion du tableau
- 26. en utilisant axspreadsheet dans vb.net
- 27. aller chercher html qui est en fait un nombre, je veux ajouter 1 et le remplacer
- 28. shapefiles TIGER - en utilisant et en interprétant
- 29. Linq to SQL - Ne pas aller chercher une colonne particulière
- 30. GCC Inline Assembly: Aller au bloc extérieur de l'étiquette