Domanda

Ho un UITableView e ho creato una cella personalizzato per visualizzare mio tavolo. Ho 6 UILables visualizzati e anche se ho solo 20 record da mostrare, è molto lento quando ho scorrere.

Ecco come il mio - tableView: cellForRowAtIndexPath: Sembra che:

- (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 ragione per l'esecuzione di quel lento su di scorrimento è causa di tutte le cose che sto facendo qui (NSDateFormatter, CGMakeRect, floatToStringFormat ...) o c'è qualcosa di sbagliato con il riutilizzo di cellule?

floatToStringFormat è una funzione per formattare un numero a 4 decimali:

- (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;
}
È stato utile?

Soluzione

Creazione e impostazione di formattatore oggetti è un'operazione costosa in effetti, quindi mi piacerebbe iniziare con il riutilizzo di oggetti di formattazione dal momento che sono gli stessi su ogni chiamata di funzione. Quindi, o renderli variabili statiche o variabili istantanee nella classe di origine di dati e creare la seguente modo:

//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];
...

Altri suggerimenti

In primo luogo, si utilizzano due identificatori diversi:. CustomCellIdentifier e BanciHistoryCellIdentifier

In secondo luogo, non si ha realmente bisogno di fare tutto dopo NSArray *object; ogni volta che viene visualizzata una nuova cella? Perché se non lo fai, si dovrebbe spostare al blocco if (cell == nil) {.

Dalla mia esperienza il disegno delle cellule vista tabella è significativamente rallentato se si dispone di tre o più subviews (dipende anche dal dispositivo e il punto di vista però). Cerca di disegnare direttamente il contenuto in drawRect:. Invece di usare subviews, questo dovrebbe accelerare le cose

Che cosa ci fai qui:

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

Vai leggere il documentazione su come farlo correttamente. In secondo luogo, se questo sta impiegando troppo tempo per convertire le date e numeri in stringhe quindi memorizzare i valori di stringa, invece, e li trasformano in valori quando è necessario modificarle.

Avete il set CellIdentifier in Interface Builder? Deve corrispondere esattamente quello che si sta utilizzando nel codice. Impostare un punto di interruzione in cui si carica il cellulare dal pennino e assicurarsi che sia il riutilizzo di celle quando si scorre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top