Balise UIButton non affectée à indexPath.row après 6 cellules

J'ai un problème étrange qui se passe ici. J'ai un TableView et j'affecte le indexPath.row à l'label d'un UIButton ainsi je peux passer ce tag comme paramètre sur une section et donner un object au controller de vue suivant. Tout fonctionne Hunky Dory jusqu'à ce que je passe 6 cellules dans le TableView, lorsque le button passe le mauvais object du tableau. J'ai décidé de mettre quelques NSLogs pour voir ce qui se passait et je trouve les résultats assez bizarres. L'affectation buttonForApplyingTag.tag = indexPath.row; se produit juste après les NSLogs et est la dernière déclaration avant la return cell; . Puisque la valeur réelle de indexPath.row est correcte, les objects du tableau sont chargés correctement. C'est juste les buttons qui causent des problèmes. Voici ma sortie:

 2012-11-28 19:01:57.596 IndexPath.row: 0 2012-11-28 19:01:57.596 IndexPath.Row from Tag: 0 2012-11-28 19:01:57.597 SearchResults Count: 100 2012-11-28 19:01:57.598 IndexPath.row: 1 2012-11-28 19:01:57.598 IndexPath.Row from Tag: 1 2012-11-28 19:01:57.598 SearchResults Count: 100 2012-11-28 19:01:57.599 IndexPath.row: 2 2012-11-28 19:01:57.600 IndexPath.Row from Tag: 2 2012-11-28 19:01:57.600 SearchResults Count: 100 2012-11-28 19:01:57.601 IndexPath.row: 3 2012-11-28 19:01:57.601 IndexPath.Row from Tag: 3 2012-11-28 19:01:57.602 SearchResults Count: 100 2012-11-28 19:01:57.602 IndexPath.row: 4 2012-11-28 19:01:57.603 IndexPath.Row from Tag: 4 2012-11-28 19:01:57.603 SearchResults Count: 100 2012-11-28 19:01:57.604 IndexPath.row: 5 2012-11-28 19:01:57.605 IndexPath.Row from Tag: 5 2012-11-28 19:01:57.605 SearchResults Count: 100 2012-11-28 19:02:02.004 IndexPath.row: 6 2012-11-28 19:02:02.004 IndexPath.Row from Tag: 6 2012-11-28 19:02:02.005 SearchResults Count: 100 2012-11-28 19:02:03.993 IndexPath.row: 7 2012-11-28 19:02:03.993 IndexPath.Row from Tag: 0 2012-11-28 19:02:03.993 SearchResults Count: 100 2012-11-28 19:02:17.846 IndexPath.row: 8 2012-11-28 19:02:17.846 IndexPath.Row from Tag: 0 2012-11-28 19:02:17.846 SearchResults Count: 100 2012-11-28 19:02:18.482 IndexPath.row: 9 2012-11-28 19:02:18.482 IndexPath.Row from Tag: 0 2012-11-28 19:02:18.482 SearchResults Count: 100 

Désolé pour le nombre excessif de lignes, mais vous avez l'idée. Cette tendance se poursuit jusqu'à 100, ce qui signifie que les buttons ne reçoivent pas la bonne balise. Encore plus bizarre est le fait que lorsque le button est cliqué sur les cellules avec une fausse balise indexPath.row, une autre balise est apparemment constituée et je reçois une balise de faible valeur. En outre, lorsque la cellule 6 est partiellement apparue en bas de TableView, même si la cellule est réellement chargée, les NSLogs n'ont pas été validés dans le débogueur. Le button échoue et renvoie une balise de 5. Donc il y a en fait 3 problèmes avec cette façon de faire les choses.

Vraiment, ce que je veux requestr est pourquoi est ce comportement étrange qui se passe, et comment puis-je le réparer? Et deuxièmement, puisque cela semble être un désastre, y a-t-il un meilleur moyen de transmettre la valeur indexPath.row pour que je puisse get un object de mon tableau quand on clique sur le button?

Merci pour toute aide.
Cordialement,
Mike

PS Je suis un amateur complet, donc si vous pouviez l'expliquer en termes de Lehmann, j'apprécierais.

EDIT: Voici le code où j'atsortingbue réellement l'label au button, comme demandé.

  UIButton *buttonForApplyingTag = (UIButton *)[cell viewWithTag:1004]; NSLog(@"IndexPath.row: %d", indexPath.row); NSLog(@"IndexPath.Row from Tag: %d", buttonForApplyingTag.tag); NSLog(@"SearchResults Count: %d", [searchResults count]); buttonForApplyingTag.tag = indexPath.row; return cell; 

EDIT 2: Voici le code entier de cellForRowAtIndexPath:

 if (isLoading) { return [tableView dequeueReusableCellWithIdentifier:LoadingCellIdentifier]; } else if ([searchResults count] == 0) { return [tableView dequeueReusableCellWithIdentifier:NothingFoundCellIdentifier]; } else { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SearchResultCellIdentifier]; [tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine]; [tableView setSeparatorColor:[UIColor grayColor]]; /* Then we do a load of assignments for labels in the cell, then we reach the tagging code. */ 

SearchResultCellIdentifier vient de ceci: static NSSsortingng *const SearchResultCellIdentifier = @"SearchResultCellProto";

Il semble que ce que vous voulez faire est d'avoir des buttons dans les cellules, et ensuite savoir quel button de la cellule a été pressé lorsque l'action du button se produit. L'utilisation de balises est une idée raisonnable, mais difficile à mettre en œuvre car la balise doit changer lorsque la cellule est réutilisée (et se retrouve dans un path d'index différent).

Voici une meilleure approche: Ajoutez les buttons en utilisant une balise constante (ou sans balise), puis sur l'action de clic faites ceci …

 - (IBAction)pressedButtonInMyCell:(id)sender { UIButton *button = (UIButton *)sender; // find the cell that contains the button, this might be one or two levels // up depending on how you created the button (one level in code, two in IB, probably) UIView *view = button.superview; while (view && ![view isKindOfClass:[UITableViewCell self]]) view = view.superview; UITableViewCell *cell = (UITableViewCell *)view; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; NSLog(@"cell is in section %d, row %d", indexPath.section, indexPath.row); } 

Cette ligne obtient le button de la cellule:

 UIButton *buttonForApplyingTag = (UIButton *)[cell viewWithTag:1004]; 

Cependant, dans les cellules réutilisées, l'label n'est pas 1004. C'est en fait l'label qui a été définie lorsque la cellule a été utilisée précédemment. Donc, buttonForApplyingTag sera probablement nul sur une cellule réutilisée et l'set du système échoue.

Il est préférable de créer une cellule sous-classée et de lier l'UIButton à une variable d'instance.

Sous-class:

Créez une nouvelle sous-class UITableViewCell, appelons-la CustomCellView . Assurez-vous d'instancier cette class dans cellForRowAtIndexPath au lieu de UITableViewCell . Ajoutez-y une variable d'instance appelée theButton . Ensuite, créez et assignez buttonForApplyingTag à cette variable d'instance. Il est préférable de le faire dans l' init de votre sous-class. Ensuite, dans cellForRowAtIndexPath , vous n'avez pas besoin de créer un button, vous utilisez simplement cell.theButton .

Mais, mieux encore, il suffit de stocker le 'tag' dans une variable d'instance entière de votre sous-class.