Question

J'ai créé une vue de table qui est rempli avec une coutume UITableViewCell ( comme celui-ci ). Chacune des cellules contient deux UIButtons. Je cède l'action du bouton comme ceci:

 [decreaseButton addTarget:self action:@selector(decrease) forControlEvents:UIControlEventTouchUpInside];

Est-ce la bonne façon? Quoi qu'il en soit, cela fonctionne, mais dans ma méthode « diminution » Je dois savoir dans quel de mes 18 vue lignes de tableau sur le bouton a été pressé. indexPath.row ne fonctionne pas en dehors de la méthode cellForRowAtIndexPath, bien sûr. Quelqu'un peut-il me expliquer comment faire?

Merci beaucoup à l'avance!

iYassin

Était-ce utile?

La solution

Vous pouvez le faire de deux manières.

Contrôle de l'expéditeur de l'événement

Changez votre méthode de diminution de:

- (void)decrease;

à:

- (void)decrease:(id)sender;

De cette façon, quand diminution est appelée, vous recevrez une référence au bouton qui avait la touche jusqu'à l'événement à l'intérieur.

Définir la baisse Méthode Plus près de l'information

Une autre solution serait d'avoir une instance cible différente pour chaque bouton (par exemple, mettre en œuvre la fonction de diminution dans le cadre de la cellule personnalisée). De cette façon, vous savez le bouton qui a été touché était celui de la cellule actuelle.

Autres conseils

La façon dont je résolu ce problème est que je garde la trace des données que je pourrais avoir besoin à l'intérieur de mon objet de cellule personnalisée. Et le bouton est relié non au récepteur externe, mais la cellule il est auto qui à son tour sait comment appeler le vrai récepteur de l'action.

Je fais ma cellule avec quelque chose comme:

cell = [[MyTableViewCell alloc] initWithStyle:style 
                              reuseIdentifier:CellIdentifier];

Et j'ai une méthode de configuration si je peux ré-initialiser une cellule quand je DEQUEUE il:

[cell setupMyCellWithContext:objectID 
                      target:[[UIApplication sharedApplication] delegate] 
                      action:@selector(someAction)];

dans votre classe de cellule que vous utilisez l'action et la cible qui a été envoyé dans la méthode de configuration pour appeler la véritable cible:

- (void)doAction:(id)sender {
    if ([target respondsToSelector:action]) {
        [target performSelector:action withObject:objectID afterDelay:0];
    }
}

Ainsi, lorsque votre utilisateur tape sur le bouton, les appels os [de doAction cellulaire:]., Qui appelle la cible et sélecteur action que vous définissez avant la main avec l'objet de contexte correct

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top