TableView et image cell

Salut salut !


 


J'ai un petit souci avec des UITableViewCell.


Le context : deux tableView sur un même controler. Ils sont côte à  côte et quand je scroll les deux scrollent en même temps.


 


Mes cells sont des images stockées en local. J'ai implémenté mon data source de cette manière en cherchant sur le web comment optimiser au max la fluidité de mon scroll :



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @ImageCell;

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
if(cell == nil) cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSDictionary *dictionary = nil;
if(tableView == _leftTableView) dictionary = [_leftArray objectAtIndex:indexPath.row];
else dictionary = [_rightArray objectAtIndex:indexPath.row];

UIImage *image = [UIImage imageWithContentsOfFile:dictionary[@image_path]];
dispatch_async(dispatch_get_main_queue(), ^{
if ([[tableView indexPathsForVisibleRows] containsObject:indexPath]) {
CustomCell * correctCell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
[correctCell.photoView setImage:image];
[correctCell setNeedsLayout];
}
});
});
return cell;
}

C'est fluide (contrairement à  un chargement synchrone) mais mes cells sont mal réutilisées (quand je scroll très lentement par exemple) et de mauvaises images s'affichent ...


 


Une idée de comment je pourrai résoudre ça ?


Réponses

  • Essaie de positionner ton image à  nil en dehors des dispatch_async ?


  • Tu veux dire l'image de ma cell ? Je vais essayer


  • Ca ne change rien. Parfois (même sans mette à  nil, ma cell est vide)


  • Ah zut, désolé.


    Dans mes souvenirs j'avais eu un soucis similaire. Initialement avec dispatch_async() que j'ai changé par la suite par des NSBlockOperation (pour d'autres raisons d'optimisation).


    Grosso modo mon code ressemble à  ceci :



    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // Recup image
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // Set de l'image de ma cell;
    }];
    }];
    [self.queue addOperation:operation];
    [cell.iconsImageView setImage:nil]; // Mise a nil sinon c le bordel

    Si ça peut aider...


  • Ca ne change rien ^^ 


    Le problème vient peut-être de ma condition ? 



    if ([[tableView indexPathsForVisibleRows] containsObject:indexPath])
  • Pour ma part je n'ai pas ce genre de condition, je fais directement :



    [[(MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath] iconsImageView] setImage:iconsImage];
  • Am_MeAm_Me Membre
    juillet 2013 modifié #8

    Moi je tien à  dire que je fais comme Kubernan et je n'ai pas de probleme.


     


    mais la phrase qui m'intrigue depuis le début est : 


    quand je scroll les deux scrollent en même temps.

     



     


    Comment est-ce possible ? à  moins que ton doit fait tout l'écran ;D je ne vois pas comment tu peux scroller 2 trucs en meme temps 


  • CeetixCeetix Membre
    juillet 2013 modifié #9

    En gros j'ai ça :


     


    two-tables.png


     


     


    Deux table view embarquées dans une scrollview et je change leur position selon celle de ma scrollview.


    En virant la condition ça marche je n'ai plus le problème. Par contre au premier scroll je sens comme un minuscule accrochage.


  • Heuu ça ne pose pas de problème des table view dans une scrollview ? Me semble avoir lu ça quelque part un jour...


  • J'ai rien lu de tel mais si tu retrouves je veux bien voir :)


  • Bah Google lui a déjà  eu affaire à  ce problème. A moins que tu ai déjà  visité tout les sites :D


  • Eu là  ça donne juste des questions de comment implémenter ça, moi c'est bon ça marche :)


    Et en virant la conditions c'est good j'ai plus de soucis




  • J'ai rien lu de tel mais si tu retrouves je veux bien voir :)




     


    Il m'avais semblé. Je dois confondre car j'ai rien trouvé dans le programming guide.


     


     




     


    Et en virant la conditions c'est good j'ai plus de soucis




     


    Cool ! 

  • Merci :)


Connectez-vous ou Inscrivez-vous pour répondre.