J'ai posé quelques questions sur le débordement de pile concernant le sous-classement d'un UIButton
, et quelques personnes m'ont informé que je ne devrais pas sous-classer un UIButton
.
Quels sont les inconvénients de sous-classer un UIButton
? Et je sais que c'est vague, mais quelles sont les autres alternatives au sous-classement d'un UIButton
?
Les frameworks Cocoa adoptent l'approche selon laquelle le modèle de composition d'objet est plus approprié que la hiérarchie de classes traditionnelle.
En général, cela signifie qu'il existe probablement une propriété sur UIButton où vous pouvez définir un autre objet pour gérer divers aspects du bouton. C'est le moyen préféré de "personnaliser" le fonctionnement de votre bouton.
L'une des principales raisons de ce modèle est que de nombreux composants de bibliothèque créent des boutons et ne savent pas que vous souhaitez qu'ils créent des instances de votre sous-classe.
J'ai remarqué votre commentaire ci-dessus à propos du gain de temps lorsque vous avez la même configuration de bouton sur plusieurs boutons de votre application. C'est le moment idéal pour utiliser le modèle de conception de la méthode d'usine, et dans Objective-C, vous pouvez l'implémenter avec une catégorie donc il est disponible directement sur UIButton.
@interface UIButton ( MyCompanyFactory )
+(UIButton *) buttonWithMyCompanyStyles;
@end
@implementation UIButton
+(UIButton *) buttonWithMyCompanyStyles {
UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom];
// [theButton set...
return theButton;
}
@end
C'est parce que UIButton
est un peu spécial en ce sens qu'il y a quelques complexités/subtilités/restrictions (c'est-à-dire des remplacements supplémentaires à définir, notamment +buttonWithType:
) requis pour qu'il fonctionne comme prévu. C'est plus que l'habituel -initWithFrame:
(et -initWithCoder:
, si utilisé dans les XIB). IDK pourquoi les auteurs du framework ont permis à ces détails de fuir dans notre domaine, mais c'est quelque chose que nous devons traiter maintenant. La restriction est que votre implémentation ne doit pas dépendre (c'est-à-dire étendre) les styles de boutons système prédéfinis; Vous devez prendre UIButtonTypeCustom
comme point de départ pour une sous-classe UIButton
.
Si vous cherchez simplement quelque chose de plus léger avec vos propres "sous-vues", vous devriez plutôt sous-classer UIControl. UIButton sous-classe UIControl et peut gérer des événements, comme:
[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside];
Les sous-classes UIControl UIView vous permettent de disposer proprement les sous-vues sur toutes les vues contenues dans votre sous-classe UIControl et d'éviter les vues inutiles fournies avec UIButton. En substance, vous créez simplement votre propre "UIButton", mais vous évitez d'avoir à contourner des comportements et des fonctionnalités dont vous n'avez pas vraiment envie ou dont vous n'avez pas besoin.