2010-09-07 5 views
1

J'ai créé une sous-classe pour un UIButton et j'espérais lui transmettre une propriété personnalisée. Cependant, cela ne fonctionne pas et j'ai lu depuis que le fait de sous-classer un UIButton n'est pas une bonne idée.propriétés personnalisées pour UIButton (iphone sdk)

Ma question est comment puis-je attribuer une propriété personnalisée à un bouton? Je crée un bouton qui est placé dans la vue d'ensemble d'une table groupée. Je veux passer à ce bouton le numéro de la section. Je l'ai fait avec succès avec un UISwitch dans chaque rangée, mais ne peux pas utiliser la même méthode pour le UIButton.

donc créer un bouton

MattsButtonClass *button = [MattsButtonClass buttonWithType:UIButtonTypeCustom]; 
button.frame = CGRectMake(240, 15, 45, 30); 
button.MFsectionNo = section; //this would be 1, 2 etc 
//etc 

Alors, comment dois-je faire cela en fait? vous verrez que mon UIButton a une sous-classe, qui ressemble à ce

//.h file 
@interface MattsButtonClass : UIButton { 
    int MFsectionNo; 
} 

@property (nonatomic) int MFsectionNo; 

@end 

//.m file 
@implementation MattsButtonClass 

@synthesize MFsectionNo; 


@end 

L'erreur sur ce qui précède est

-[UIRoundedRectButton MFsectionNo:]: unrecognized selector sent to instance 0x5673650 
2010-09-07 22:41:39.751 demo4[67445:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIRoundedRectButton MFsectionNo:]: unrecognized selector sent to instance 0x5673650' 

Est-ce que je suis en train pas possible? Merci pour toute aide ...

Répondre

5

Vous pourriez probablement utiliser la propriété tag de UIButton pour stocker votre numéro de section (peut-être avec un décalage, puisque tag est 0 par défaut)

+0

+1. Simple mais efficace si un entier simple est suffisant. – Eiko

+0

Oui cela fonctionnerait - aucune idée pourquoi je n'ai pas pensé à ça. Je vais vous dire comment ça se passe! –

+0

a parfaitement fonctionné. Si simple. Merci à d'autres pour les options aussi. –

2

Ce n'est pas possible parce que vous êtes en utilisant l'appel de fonction:

[MattsButtonClass buttonWithType:UIButtonTypeCustom] 

Ce message retournera un UIButton pas un MattsButtonClass. C'est pourquoi la propriété n'existe pas sur l'objet retourné. Cela rend difficile la sous-classe UIButton. Cependant, vous pourrez peut-être réaliser la fonction désirée de la manière suivante:

MattsButtonClass *button = [[MattsButtonClass alloc] initWithFrame:CGRectMake(240, 15, 45, 30)]; 
button.MFsectionNo = section; 
0

Peut-être conserver un tableau contenant des références aux boutons dans chaque en-tête de section?

 
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UIButton *myButton = [[UIButton alloc] init]; 
    [myButton addTarget:self action:@selector(myButton_touchUpInside:) forControlEvents:UIControlEventTouchUpInside]; 

    // previously defined as an instance variable of your viewcontroller 
    // NSMutableArray *sectionHeaderButtons; 
    [sectionHeaderButtons insertObject:myButton atIndex:section]; 
} 

Ensuite, dans le gestionnaire pour l'événement TouchUpInside du bouton:

 
- (void)myButton_touchUpInside:(id)sender 
{ 
    int i; 
    for (i = 0; i < [sectionHeaderButtons count]; i++) 
    { 
     if ([sectionHeaderButtons objectAtIndex:i] == sender) 
      break; // now you know what section index was touched 
    } 
} 

Si l'index de la section du bouton touché est ce que vous êtes après, cela devrait faire l'affaire. Cependant, ce n'est pas optimale si:

  1. Vous réorganisant les sections tableView ou
  2. Vous avez beaucoup de sections

Hope this helps.

Questions connexes