Frage

Ich habe eine UitableView und habe eine benutzerdefinierte Zelle erstellt, um meine Tabelle anzuzeigen. Ich habe 6 Uilables angezeigt und obwohl ich nur 20 Datensätze zu zeigen habe, ist es sehr langsam, wenn ich scrolle.

So wie mein - TableView: CellForrowatIndexPath: Sieht aus wie:

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

Der Grund für das Laufen so langsam bei Scroll ist an all den Dingen, die ich hier mache (NSDateFormatter, CGMakerect, FloattoStringFormat ...) oder stimmt etwas mit der Wiederverwendung von Zellen nicht?

FloattoStringFormat ist eine Funktion zur Formatierung einer Zahl nach 4 Dezimalstellen:

- (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;
}
War es hilfreich?

Lösung

Das Erstellen und Einrichten von Formatterobjekten ist in der Tat eine teure Operation. Daher würde ich mit der Wiederverwendung Ihrer Formatterobjekte beginnen, da sie bei jedem Funktionsaufruf gleich sind. Machen Sie also entweder statische Variablen oder sofortige Variablen in Ihrer Datenquellenklasse und erstellen Sie die folgende Weise:

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

Andere Tipps

Erstens verwenden Sie zwei verschiedene Kennungen: CustomCellIdentifier und BanciHistoryCellIdentifier.

Zweitens müssen Sie wirklich alles danach tun? NSArray *object; Jedes Mal, wenn eine neue Zelle angezeigt wird? Denn wenn Sie dies nicht tun, sollten Sie es in die verschieben if (cell == nil) { Block.

Nach meiner Erfahrung wird die Zeichnung von Tabellenansichtszellen erheblich verlangsamt, wenn Sie drei oder mehr Unteransicht haben (auch auf das Gerät und die Ansichten abhängt). Versuchen Sie, den Inhalt direkt in DrawRect zu zeichnen: Anstatt Subviews zu verwenden, sollte dies die Dinge beschleunigen.

Was machst du hier:

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

Geh und lies die Dokumentation Wie man das richtig macht. Zweitens, wenn dies zu lange dauert, um die Daten und Zahlen in Zeichenfolgen umzuwandeln, speichern Sie stattdessen die Stringwerte und verwandeln sie in Werte, wenn Sie sie ändern müssen.

Haben Sie den Cellidentifier im Interface Builder eingestellt? Es muss genau übereinstimmen, was Sie im Code verwenden. Stellen Sie einen Haltepunkt fest, an dem die Zelle von der NIB geladen wird, und stellen Sie sicher, dass sie beim Scrollen Zellen wiederverwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top