Forum iPhone, iPad, Apple Watch de iPhon.fr

Forum utilisateurs Apple iPhone, iPad, Apple Watch, forfaits et accessoires

Vous n'êtes pas identifié(e).

Annonce

Bienvenue sur le forum du blog iPhon.fr

Pensez à poster dans la bonne rubrique, respecter les propos des autres internautes, ne pas utiliser le langage SMS, et enfin, à utiliser la fonction 'Recherche' !
Et... Gardez le sens de l'humour, de la convivialité et de la décontraction. On n'est pas là pour se prendre la tête ! ;-)

#1 26-03-2012 12:25:26

SebLogica
Membre
Inscription : 20-03-2012
Messages : 2

Modification d'une cellule personnalisée dans UITableView

Bonjour à tous,

Dans une de mes applications, j'ai une UITableView référençant toutes les actualités récupérées via un flux RSS. Je récupère bien toutes les données et les met dans une classe Actualite, objet réutilisé ensuite pour créer chacune des cellules de la liste.
J'aimerais pouvoir griser une cellule quand elle a été lu par l'utilisateur (quand l'utilisateur clique dessus pour la 1ère fois donc).

J'ai réussi à la griser quand je clique dessus, le problème c'est que plusieurs autres cellules se grisent aussi dessous alors que je n'ai pas cliqué encore dessus.
Mon objet actualité comporte un booléen isRead qui est pourtant bien à YES ou NO en fonction de si la cellule a déjà été cliqué ou pas donc le problème ne vient pas de là. En lisant pas mal de choses sur ce genre de problème, j'ai cru comprendre que ca venait d'un mauvais rechargement des cellules mais je n'ai rien trouvé de plus

Voici ma facon d'initialiser ma UITableView :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ActualiteCell *cell = (ActualiteCell *) [tableView dequeueReusableCellWithIdentifier:ACTUALITECELL_ID];
	if(cell == nil)
	{
		[[NSBundle mainBundle]loadNibNamed:ACTUALITECELL_ID owner:self options:nil];
		
		cell = [loadedCell retain];
		loadedCell = nil;
		[cell autorelease];
	}
    
    [self configureCell:cell atIndexPath:indexPath];
    
	return cell;
}

- (void)configureCell:(ActualiteCell*)cell atIndexPath:(NSIndexPath*)indexPath {
    MyAppDelegate* delegateAppli = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
    
    // Contenu de la cellule
    cell.actu = [[delegateAppli listeActualites] objectAtIndex:indexPath.row];
}

J'ai surchargé le setter de la cell pour qu'il mette à jour chacun des champs de la cellule :

- (void) setActu:(Actu *)aActu {
    if (aActu != actu) {
        [actu release];
        actu = [aActu retain];
	}
    [self refreshUI]; // On met à jour les champs de la cellule
}

Et pour colorer la cellule, je le fais comme ceci :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MyAppDelegate* delegateAppli = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
    DetailActualiteViewController* vc = [[DetailActualiteViewController alloc] initWithNibName:@"DetailActualiteViewController" bundle:nil];
    vc.actu = [[delegateAppli listeActualites] objectAtIndex:indexPath.row];
    
    [self.tableView beginUpdates];
    [[[delegateAppli listeActualites] objectAtIndex:indexPath.row] setIsRead:YES];
    [self configureCell:(ActualiteCell *)[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    [self.tableView endUpdates];
    
    [self.navigationController pushViewController:vc animated:YES];
}

Merci pour votre aide !

Bonne journée !
Sébastien wink

Hors ligne

#2 16-04-2012 22:30:06

Sylver78
Développeur iPhone Invité
Inscription : 28-12-2009
Messages : 20

Re : Modification d'une cellule personnalisée dans UITableView

Si tu n'as pas encore trouvé la solution, voici la piste :
Dans cellForRowAtIndexPath il faut positionner "setIsRead" à la bonne valeur (il faut donc mémoriser quelque part le fait que la cellule à tel ou tel index est lue ou non !
Ca vient du fait que le principe de base des TableViewCell, c'est qu'elles sont réutilisées (en gros pour créer une nouvelle cellule qui va apparaitre, tu réutilises des cellules qui viennent de disparaître, il faut donc positionner tous les paramètres de ta cellule, car ceux qui ne sont pas réinitialisés gardent les valeurs de la cellule qui a été "recyclée".
Bon courage wink


Une Freebox Révolution ? Alors il vous faut mon appli "Freebox Downloader" dispo sur l'AppStore pour gérer tous vos téléchargements
Un NAS Synology ? Alors il vous faut mon appli "SynoDS" dispo sur l'AppStore pour gérer tous vos téléchargements à distance

Hors ligne

Pied de page des forums

L'iPhone sur iPhon.fr, le blog de l'iPhone - blog iPad

iPhon.fr et son forum ne sont pas liés à Apple, Orange, SFR ou autres et les marques citées sont la propriété de leurs détenteurs respectifs.