Objectif C: Les boutons créés à partir de la sous-classe de la classe UIButton ne fonctionnent pas
Je suis entrain de créer une sous-classe de UIButton afin de créer mes propres boutons. Mon code comme suit:
//interface file (subclass of uIButton
@interface UICustomButton : UIButton
{
Answer *answer;
NSString *btnType;
}
@property (nonatomic, retain) Answer *answer;
@property (nonatomic, assign) NSString *btnType;
- (id)initWithAnswer:(Answer *)ans andButtonType:(NSString *)type andFrame:(CGRect)frame;
- (void)buttonPressed;
@end
//Implementation file (.m)
@implementation UICustomButton
@synthesize answer,btnType;
- (id)initWithAnswer:(Answer *)ans andButtonType:(NSString *)type andFrame:(CGRect)frame;
{
self = [super initWithFrame:frame];
if (self)
{
self = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
self.backgroundColor = [UIColor colorWithHexString:@"#E2E4E7"];
}
[self addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlStateNormal];
self.answer = ans;
self.btnType = type;
return self;
}
Je suis confronté à quelques problèmes à obtenir le code ci-dessus fonctionne. J'ai 2 problèmes
1) Les boutons ne répondent pas à le sélecteur de la méthode "buttonPressed"
2) je suis frapper une erreur d'exécution pour les lignes de soi.réponse = ans' et 'auto.btnType = " type de trace de la Pile comme suit:
-[UIButton setAnswer:]: unrecognized selector sent to instance 0x614ebc0
2011-06-23 00:55:27.038 onethingaday[97355:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton setAnswer:]: unrecognized selector sent to instance 0x614ebc0'
Ce que je fais mal?
source d'informationauteur Zhen | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe parce que vous êtes la création d'un
UIButton
type d'objet et non pas unUICustomButton
type à l'intérieur de la méthode init lorsque vous neEssayez de remplacer votre
init
méthode pourCe sera la cause de
self
être unUICustomButton
type d'objet.Aussi, vous êtes à l'aide d'un type incorrect pour le UIControlState paramètre lorsque vous ajoutez la cible à votre bouton à l'aide de la
addTarget:action:forControlEvents:
méthodeVous devez utiliser la valeur parmi celles ci-dessous:
EDIT:
Notes sur UIButton sous-classement
De nombreuses références sur le web disent que vous ne devriez PAS sous-classe de la
UIButton
classe, mais pas seulement quelqu'un a dit pourquoi, mais ce qui est également profondément ennuyé, c'était que le UIButton De Référence De Classe ne rien dire à ce sujet à tous.Si vous prenez UIWebView De Référence De Classe par exemple, il est dit explicitement que vous ne devriez pas sous-classe
UIWebView
le big deal avec
UIButton
est qu'il hérite deUIControl
et une bonne explication simple et est sur le UIControl De Référence De Classe lui-mêmeDonc, cela signifie que vous PEUT la sous-classe des
UIButton
mais vous devez être prudent sur ce que vous faites. Juste la sous-classe à modifier ses comportement et pas son apparence. Pour modifier unUIButton
apparence vous devez utiliser les méthodes d'interface fourni pour cela, comme par exemple:Références à la peine de lire
Source: mon post ici
Pas sûr que c'était dans les docs avant, mais de toute façon ce sont les notes actuelles sur
+ (id)buttonWithType:(UIButtonType)buttonType
...Pour moi, il ressemble à sous-classement est OK aussi longtemps que vous utilisez
init
au lieu debuttonWithType
. J'ai encore de l'essayer moi-même cependant.Si vous souhaitez recevoir des notifications lorsque l'utilisateur interagit avec vos boutons, tout sous-classe UIButton et de mettre en œuvre ces méthodes:
Pas de méthode d'initialisation requis.
Modifier
Cette réponse remonte à plusieurs années, et les choses ont changé - comme Apple docs maintenant explicitement mention de sous-classement et donne quelques conseils.
Donc la réponse suivante peut être hors de propos ou mal pour développement actuel et peut être ignoré si vous êtes intéressé dans l'état actuel de la technique.
UIButton est pas destinés à être sous-classé.
Vous êtes mieux de faire une catégorie et la définition d'une méthode de fabrique qui livre votre bouton nécessaire (avec le bon appel à
buttonWithType:
).initWithFrame:
n'est pas la bonne méthode pour initialiser un bouton de toute façon.