web-dev-qa-db-fra.com

Pourquoi ne devrais-je pas sous-classer un bouton UIB?

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?

34
SirRupertIII

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.

modifier, votre propre méthode d'usine

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
36
Chris Trahey

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.


Lors de l'implémentation d'une sous-classe de UIButton

15
justin

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.

11