53 votes

2 types différents de UITableViewCells personnalisés dans UITableView

dans mon UITableView je veux mettre pour la première nouvelle d'un flux rss personnalisé tableViewCell(Type A permet de le dire) et pour les autres nouvelles, deuxième, troisième, etc.. une autre coutume, tableViewCell(trype B) le problème est que la coutume tableViewCell(trype A) créé pour la première news est réutilisé, mais curieusement le nombre de lignes entre la première utilisation de la 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 est correctement réglé. quelqu'un pourrait-il me diriger dans la bonne direction sur la façon de faire le type de cellule personnalisé pour n'apparaître que pour la première news(ne pas être réutilisé)? merci

78voto

Philippe Leybaert Points 62715

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;
}
 

8voto

Chris Karcher Points 1449

Je ne comprends pas tout à fait votre question, mais j'ai remarqué deux choses curieuses. Si vous utilisez deux types de cellules différents, vous devez utiliser deux identificateurs de cellule distincts lorsque vous appelez '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";
 

En outre, je n'ai jamais rien vu de tel:

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

Pourquoi ne pas simplement utiliser:

 int feedIndex = 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