web-dev-qa-db-fra.com

2 types différents de cellules UITableView personnalisées dans UITableView

dans mon UITableView, je veux définir pour les premières nouvelles d'un flux rss une tableViewCell personnalisée (type A, disons) et pour les autres nouvelles deuxième, troisième, etc., une autre tableViewCell personnalisée (trype B), le problème est que la tableViewViewCell personnalisée ( le trype A) créé pour les premières actualités est réutilisé, mais curieusement le nombre de lignes entre la première utilisation du customViewCell (type A) et la deuxième apparition du même type de customViewCell n'est pas égal.

mon cellForRowAtIndexPath il ressemble à ceci.

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

    int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];
    Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1];
    static NSString *CellIdentifier = @"Cell";

    if(feedIndex == 0){
        MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
            [[[cell subviews] objectAtIndex:0] setTag:111];
        }

        cell.feed = item;

        return cell;

    }
    else{
        NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier orientation:currentOrientation] autorelease];
            [[[cell subviews] objectAtIndex:0] setTag:111];
        }

        cell.feed = item;

        return cell;

    }
    return nil;
}    

les deux types de cellules ont des hauteurs différentes qui sont réglées correctement. quelqu'un pourrait-il m'orienter dans la bonne direction sur la façon de faire apparaître la cellule personnalisée de type A uniquement pour les premières nouvelles (non réutilisée)? Merci

53
Sorin Antohi

Vous devez créer un identifiant de cellule différent pour les deux styles de cellule:

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

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];
Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1];

static NSString *CellIdentifier1 = @"Cell1";
static NSString *CellIdentifier2 = @"Cell2";

if(feedIndex == 0) {

   MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

   if (cell == nil) {
       cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier1] autorelease];
       [[[cell subviews] objectAtIndex:0] setTag:111];
   }

   cell.feed = item;

   return cell;
}
else {
   NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

   if (cell == nil) {
       cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier2 orientation:currentOrientation] autorelease];
       [[[cell subviews] objectAtIndex:0] setTag:111];
   }

   cell.feed = item;

   return cell;
}

return nil;
}
78
Philippe Leybaert

Je ne comprends pas entièrement votre question, mais j'ai remarqué deux choses curieuses. Si vous utilisez deux types de cellules différents, vous devez utiliser deux identificateurs de cellules distincts lors de l'appel de "dequeueReusableCellWithIdentifier". Vous utilisez actuellement le même identifiant pour les deux, ce qui est incorrect. Essayez quelque chose comme:

static NSString *MainArticleIdentifier = @"MainArticle";
static NSString *NewsIdentifier = @"News";

De plus, je n'ai jamais rien vu de tel:

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];

Pourquoi ne pas simplement utiliser:

int feedIndex = indexPath.row;
8
Chris Karcher

dans cellForRowAtIndexPath

if ("Condition for cell 1") {
        cellV = ("customCell" *)[tableView dequeueReusableCellWithIdentifier:@"your ID cell in .xib"];

        if (cellV == nil) {
            [[NSBundle mainBundle] loadNibNamed:@"YOUR-CELL-FILENAME" owner:self options:nil];
            cellV = "OUTLET-CEll-IN-VC";
        }
    } else {
        cellV = ("customCell" *)[tableView dequeueReusableCellWithIdentifier:@"your ID cell2 in .xib"];

        if (cellV == nil) {
            [[NSBundle mainBundle] loadNibNamed:@"YOUR-CELL2-FILENAME" owner:self options:nil];
            cellV = "OUTLET-CEll-IN-VC";
        }
    }

[self configureCell:cellV indexpath:indexPath withClipVo:clip];

return cellV;
0
jose920405