Question

J'ai un UITableView et j'ai créé une cellule personnalisée pour afficher ma table. J'ai 6 UILables affichés et bien que je ne dispose que de 20 enregistrements à montrer, il est très lent quand je défiler.

Voici comment mon - tableView: cellForRowAtIndexPath: ressemble à:

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

    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";

    HistoryCell *cell = (HistoryCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    if (cell == nil) { 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"HistoryCell" owner:nil options:nil];

        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[UITableViewCell class]])
                cell = (HistoryCell *) oneObject;
    }

    NSArray *object;
    object = [cours objectForKey: [NSString stringWithFormat:@"%d", indexPath.section]];
    History *rowData = [object objectAtIndex:indexPath.row];

    if (rowData.month == 99) {
        cell.hour.frame = CGRectMake(10, 0, 135, 35);
        cell.data.hidden = YES;
        cell.hour.textColor = [UIColor blackColor];
        cell.hour.font = [UIFont fontWithName:@"Verdana" size:17];
    } else {
        cell.data.hidden = NO;
        cell.hour.frame = CGRectMake(10, 16, 135, 19);
        cell.hour.textColor = [UIColor grayColor];
        cell.hour.font = [UIFont fontWithName:@"Verdana" size:12];
    }

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"d (EEEE)"];
    [formatter setLocale:self.selectedLanguageLocale];
    NSString *stringFromDate = [formatter stringFromDate:rowData.data];
    [formatter release];

    cell.data.text = stringFromDate;
    cell.hour.text = rowData.ora;

    float Var1  = [rowData.Var2 floatValue];
    float Var2  = [rowData.Var2 floatValue];

    cell.R1.text = [self floatToStringFormat: [rowData.R1 floatValue]];
    cell.R2.text = [self floatToStringFormat: [rowData.R2 floatValue]];

    if (Var1 <= 0) {
        cell.Var1.textColor = [UIColor greenColor];
    } else {
        cell.Var1.textColor = [UIColor redColor];
    }
    if (Var2 <= 0) {
        cell.Var2.textColor = [UIColor greenColor];
    } else {
        cell.Var2.textColor = [UIColor redColor];
    }
    cell.Var1.text = [self floatToStringFormat:Var1];
    cell.Var2.text = [self floatToStringFormat:Var2];

    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

La raison de l'exécution qui ralentissent le défilement est à cause de toutes les choses que je fais ici (NSDateFormatter, CGMakeRect, floatToStringFormat ...) ou est-il quelque chose de mal avec la réutilisation des cellules?

floatToStringFormat est fonction de formater un numéro à 4 décimales:

- (NSString *)floatToStringFormat:(float)number{
    NSNumberFormatter *myFloat = [[NSNumberFormatter alloc] init]; 
    [myFloat setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
    [myFloat setNumberStyle:NSNumberFormatterDecimalStyle];
    [myFloat setRoundingMode:NSNumberFormatterRoundHalfUp];
    [myFloat setMinimumFractionDigits:4];
    [myFloat setMaximumFractionDigits:4];
    NSString *res = [myFloat stringFromNumber:[NSNumber numberWithFloat:number]];
    [myFloat release];
    return res;
}
Était-ce utile?

La solution

Création et mise en place d'objets formatter est une opération coûteuse en effet, donc je commence par réutiliser vos objets formatter car ils sont les mêmes sur chaque appel de fonction. Donc, soit les rendre variables statiques ou variables instantanées dans votre classe de source de données et créer de la manière suivante:

//static variable case
NSDateFormatter *formatter = nil;
if (!formatter){
   formatter = [[NSDateFormatter alloc] init];
   [formatter setDateFormat:@"d (EEEE)"];
   [formatter setLocale:self.selectedLanguageLocale];
}
NSString *stringFromDate = [formatter stringFromDate:rowData.data];
...

Autres conseils

Tout d'abord, vous utilisez deux identifiants différents. CustomCellIdentifier et BanciHistoryCellIdentifier

En second lieu, avez-vous vraiment besoin de faire tout ce qui suit NSArray *object; chaque fois qu'une nouvelle cellule est affichée? Parce que si vous ne le faites pas, vous devez la déplacer au bloc if (cell == nil) {.

D'après mon expérience du dessin des cellules vue de table est considérablement ralenti si vous avez trois ou plusieurs sous-vues (dépend également de l'appareil et les points de vue cependant). Essayez de dessiner directement le contenu drawRect:. Au lieu d'utiliser des sous-vues, ce qui devrait accélérer les choses

Que faites-vous ici:

if (cell == nil) { 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"HistoryCell" owner:nil options:nil];

        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[UITableViewCell class]])
                cell = (HistoryCell *) oneObject;
    }

Allez lire la documentation sur la façon de le faire correctement. En second lieu, si cela prend trop de temps pour convertir les dates et les numéros de chaînes puis stocker les valeurs de chaîne à la place, et les transformer en valeurs lorsque vous avez besoin de les modifier.

Avez-vous l'ensemble de CellIdentifier dans Interface Builder? Il doit correspondre exactement à ce que vous utilisez dans le code. Définir un point d'arrêt où il charge la cellule de la pointe et assurez-vous qu'il réutiliser les cellules lorsque vous faites défiler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top