2 votes

Problème avec la méthode de source de données cellForRowAtIndexPath

Mon problème est le suivant : J'assigne un tableau mutable au cellForRowAtIndexPath afin d'afficher chaque objet du tableau dans une cellule. Jusqu'ici tout va bien, les cellules sont affichées comme prévu. Maintenant je veux afficher (selon une condition) un UILabel dans la première cellule, de sorte que les autres objets du tableau mutable seront déplacés vers la deuxième cellule, puis la troisième, etc. Le problème est que, lorsque je teste cette condition, et qu'elle est vraie, l'objet UILabel est affiché dans la première cellule avec le premier objet . Donc en fait, deux éléments sont dans la même cellule, ce qui n'est pas ce que j'attends. Je veux (lorsque la condition est vraie) décaler tous les éléments, de sorte qu'ils soient affichés à partir de la deuxième cellule afin de laisser la première cellule à l'état d'attente. UIlabel .

Mon code pertinent qui ne me donne pas ce que j'attends, est le suivant :

- (UITableViewCell*)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"any-cell"];

 // Add and display the Cell     
      cell.tag = [indexPath row];
      NSLog(@"cell.tag= %i",cell.tag);
      //test the condition, if it's ok, then add the label to the first cell
      if ([self isNoScoreLabelDisplayed] && cell.tag==0) {
        UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 220, 50)];
        [lbl setBackgroundColor:[UIColor greenColor]];
        [cell addSubview:lbl];
      }
    cell.tag = [self isNoScoreLabelDisplayed]?[indexPath row]+1:[indexPath row];//here i wanted to shift the tags in case the condition is true, so that all the elements will be displayed from the second cell. But seems not doing what i want :(

      //
      if (indexPath.row < cellList.count) {

            [cell addSubview:[cellList objectAtIndex:[indexPath row]]];//cellList is the mutable array from which i get all the elements to display in the cells

      }else{

            [cell addSubview:nextButton];
      }

      return cell;
}

Est-ce que j'ai manqué quelque chose dans ma logique ? Merci d'avance.

1voto

ctrahey Points 12360

Vous associez directement l'indexPath.row à vos index de modèle, alors qu'ils devraient être décalés pour la cellule "title".

if (indexPath.row && (indexPath.row - 1) < cellList.count) {
            [cell addSubview:[cellList objectAtIndex:indexPath.row - 1]];
} else {

1voto

Eyal Points 3113

J'utiliserais deux identifiants de cellule pour cela, un pour la LabelCell et un pour la ArrayCell normale, cela clarifiera les choses pour vous, et vous n'obtiendrez pas une cellule avec une étiquette et un objet.

De plus, je ne sais pas vraiment ce que vous faites, mais on dirait que vous ajoutez des sous-vues à une cellule à chaque fois, mais que vous ne les supprimez nulle part. N'oubliez pas que la cellule est réutilisée...

1voto

Esses77 Points 86

Bonjour, il me semble que vous vérifiez la condition du label puis vous ajoutez le même objet dans le mutablearray car votre indexPath.row==0 < cell.count pour la première ligne.

cell.tag = [self isNoScoreLabelDisplayed]?[indexPath row]+1:[indexPath row];//here i wanted to shift the tags in case the condition is true, so that all the elements will be displayed from the second cell. But seems not doing what i want :(

Ainsi, le code ci-dessus définit simplement votre balise de cellule égale à indexpath.row + 1 si vous devez afficher l'étiquette, mais le code ci-dessous (en se rappelant que la première fois indexPath.row == 0, et donc même si vous avez affiché l'étiquette) ajoute le même objet tableau :-)

if (indexPath.row < cellList.count)

0voto

Alexander Points 6496

Vous pouvez insérer le texte de votre étiquette comme premier élément de votre conteneur et le vérifier. De cette façon, vous vous épargnerez les décalages d'index et les complications supplémentaires de votre code.

Par exemple

[cellList insertObject:@"Label name" atIndex:0];
if ([cell tag] == 0) {
    // add required label
}
else {
    // do whatever you do for your standard cells, getting them with [cellList objectAtIndex:[indexPath row]];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X