Jacob a un bon point que les méthodes de catégorie agissent différemment des méthodes de sous-classe. Apple suggère fortement que vous ne fournissiez que des méthodes de catégorie entièrement nouvelles, car il y a plusieurs choses qui peuvent mal se passer autrement - l'une d'elles étant que la définition d'une méthode de catégorie efface toutes les autres implémentations existantes de la même méthode.
Malheureusement pour ce que vous essayez de faire, UIButton
semble avoir été spécialement conçu pour éviter les sous-classes. La seule manière sanctionnée pour obtenir une instance d'un UIButton
est à travers le constructeur [UIButton buttonWithType:]
. Le problème avec une sous-classe comme Jacob suggère (comme ça):
@implementation MyCustomButton
+ (id)buttonWithType:(UIButtonType)buttonType {
return [super buttonWithType:buttonType]; //super here refers to UIButton
}
@end
est que le type retourné par [MyCustomButton buttonWithType:]
sera toujours un UIButton
, pasMyCustomButton
. Comme Apple n'a fourni aucune méthode d'initialisation UIButton
, il n'existe pas vraiment de moyen pour une sous-classe de s'instancier elle-même et d'être correctement initialisée en tant que UIButton
. Si vous voulez un comportement personnalisé, vous pouvez créer une sous-classe personnalisée UIView
qui contient toujours un bouton en tant que sous-vue, afin que vous puissiez profiter de certaines fonctionnalités de UIButton
.
Quelque chose comme ceci:
@interface MyButton : UIView {}
- (void)buttonTapped;
@end
@implementation MyButton
-(id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = self.bounds;
[button addTarget:self action:@selector(buttonTapped)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
return self;
}
- (void)buttonTapped {
// Respond to a button tap.
}
@end
Si vous voulez que le bouton de faire des choses différentes en fonction des interactions utilisateur plus complexes, vous pouvez faire plus d'appels à [UIButton addTarget:action:forControlEvents:]
pour les événements de contrôle différents.
Référence: Apple's UIButton class reference
Subclassing ne fonctionne pas, parce que 'UIButton' est un cluster de classe. Vous pouvez surcharger cette méthode sur une sous-classe, mais vous devez alors explicitement appeler '[MyCustomButton buttonWithType: ...]', et si vous le faites, vous pouvez aussi simplement 'all/init' toi même. La meilleure réponse est de faire pivoter l'IMP –
Ahh Objective C, le seul langage où l'on peut satisfaire un penchant pour imp swizzling. –