2011-10-19 2 views
1

J'ai un UITableView et j'ajoute l'affichage personnalisé à la cellule. Il traîne vraiment mais avec seulement 2 cellules. Voici à quoi ça ressemble, quand je le fais défiler de haut en bas, je peux le voir bégayer/retarder tellement (c'est sur l'iPhone 4s). J'ai regardé App Store App et le défilement avec tableviewcell très complexe est verrryyy lisse. Est-ce que je fais quelque chose de mal?UITableView en retard vraiment mauvais avec seulement 2 cellules

Voici mon code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    int row = [indexPath row]; 


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 


     UILabel *labelBarcode = [[UILabel alloc] initWithFrame:CGRectMake(80, 7, 150, 15)]; 
     [labelBarcode setFont:[UIFont fontWithName:@"Helvetica-Bold" size:16]]; 
     [labelBarcode setTag:10]; 

     UILabel *labelLength = [[UILabel alloc] initWithFrame:CGRectMake(80, 22, 150, 15)]; 
     [labelLength setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
     [labelLength setTag:11]; 

     UILabel *labelThickness = [[UILabel alloc] initWithFrame:CGRectMake(80, 37, 150, 15)]; 
     [labelThickness setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
     [labelThickness setTag:12]; 

     UILabel *labelDiameter = [[UILabel alloc] initWithFrame:CGRectMake(190, 22, 100, 15)]; 
     [labelDiameter setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
     [labelDiameter setTag:13]; 

     UILabel *labelCoating = [[UILabel alloc] initWithFrame:CGRectMake(190, 37, 100, 15)]; 
     [labelCoating setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
     [labelCoating setTag:14]; 

     UIImageView *thumbView = [[UIImageView alloc] initWithFrame:CGRectMake(4, 4, 65, 50)]; 
     [thumbView setContentMode:UIViewContentModeScaleToFill]; 
     [thumbView setTag:15]; 


     [[cell contentView] addSubview:thumbView]; 
     [[cell contentView] addSubview:labelBarcode]; 
     [[cell contentView] addSubview:labelLength]; 
     [[cell contentView] addSubview:labelThickness]; 
     [[cell contentView] addSubview:labelDiameter]; 
     [[cell contentView] addSubview:labelCoating]; 

     [thumbView release]; 
     [labelBarcode release]; 
     [labelLength release]; 
     [labelThickness release]; 
     [labelDiameter release]; 
     [labelCoating release]; 

    } 
    UILabel *labelBarcode = (UILabel *)[[cell contentView] viewWithTag:10]; 
    UILabel *labelLength = (UILabel *)[[cell contentView] viewWithTag:11]; 
    UILabel *labelThickness = (UILabel *)[[cell contentView] viewWithTag:12]; 
    UILabel *labelDiameter = (UILabel *)[[cell contentView] viewWithTag:13]; 
    UILabel *labelCoating = (UILabel *)[[cell contentView] viewWithTag:14]; 
    UIImageView *thumbView = (UIImageView *)[[cell contentView] viewWithTag:15]; 

    NSDictionary *pipe = [pipes objectAtIndex:row]; 


    NSString *stringBarcode = [pipe objectForKey:@"Barcode"]; 
    NSString *stringLength = [NSString stringWithFormat:@"Length: %@", [pipe objectForKey:@"Length"]]; 
    NSString *stringThickness = [NSString stringWithFormat:@"Wall: %@",[pipe objectForKey:@"Thickness"]]; 
    NSString *stringCoating = [NSString stringWithFormat:@"Coating: %@", [pipe objectForKey:@"Coating"]]; 
    NSString *stringDiameter = [NSString stringWithFormat:@"Diameter: %@",[pipe objectForKey:@"Diameter"]]; 


    [labelBarcode setText:stringBarcode]; 
    [labelLength setText:stringLength]; 
    [labelThickness setText:stringThickness]; 
    [labelDiameter setText:stringDiameter]; 
    [labelCoating setText:stringCoating]; 
    [thumbView setImage:[UIImage imageWithData:[pipe objectForKey:@"Thumbnail"]]]; 

    return cell; 
} 

Le retard se produit surtout quand je charge le UITableViewController. Notez que je ne fais rien d'allocation, je n'alloue que des données (à partir d'un plist) lorsque l'application se charge, et la consommation totale de mémoire d'application est à 1,56 mb.

Répondre

0

J'ai eu des problèmes similaires liés à l'affichage des images qui effectuent un certain type de redimensionnement. Je vérifierais ça en premier. Si votre ThumbView effectue un redimensionnement, cela peut entraîner un retard de la table lors du défilement. Si c'est le cas, vous pouvez essayer de prédéfinir l'image redimensionnée à la bonne taille. Je suppose que, avec seulement deux cellules, aucune de vos cellules n'est retirée de la table. Les autres réponses sur le temps de création de l'image ne s'appliquent réellement que si vous le faites plusieurs fois, ce qui ne se produirait que lorsque les cellules seraient réutilisées.

0

Cette ligne de code:

[thumbView setImage:[UIImage imageWithData:[pipe objectForKey:@"Thumbnail"]]]; 

bloque et peut prendre une grande quantité de temps, selon la quantité de données qu'il est. Faites cela sur un fil d'arrière-plan (peut-être via NSOperation), puis rechargez la ligne lorsque l'image est préparée.

0

Essayez de mettre

[thumbView setImage:[UIImage imageWithData:[pipe objectForKey:@"Thumbnail"]]];

à l'intérieur de la condition de réutilisation.

+0

Ce n'est pas approprié parce que chaque tuyau a vraisemblablement une vignette différente. Toujours en train d'exécuter ce code sur le thread principal, ce qui va tuer la performance. –

+0

Ahh ok - j'ai mal lu le code, mon erreur. J'ai eu l'impression que le thumbview était toujours le même. – barfoon

Questions connexes