2016-04-22 14 views
0

hinzugefügt Ich habe ein customCell und ich muss jede Zelle mehr als ein UILabel als „Tag“ hinzufügen, Mein Code ist wie folgt:verhindern UILabel wiederholen, um benutzerdefinierte UITableViewCell

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

    static NSString *ID = @"topicCell"; 
    MSPTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 
    NSArray *labelArray = [TopicLabelArr objectAt:index.row]; 
    for (int i = 0; i < [labelArray count]; i++) { 
     UILabel *tmpLabel = [UILabel alloc]initwithFrame .....]; 
     tmpLabel.text = [labelArray objectAt:i]; 
     [cell.view addSubview:tmpLabel]; 
    } 
    return cell; 
} 

I Xib zum Erstellen die benutzerdefinierte Zelle. Was ich brauche ist, dass die for-Schleife nur einmal in jeder Zelle ausgeführt wird. Allerdings gibt es in tableView viele Zeilen, und die Labels werden jedes Mal neu erstellt, wenn ich nach oben oder unten blättere. Wie man es verbessert? Irgendeine Idee? Vielen Dank.

+0

Setzen Sie ein Bool-Flag, bevor Sie das Label hinzufügen. –

+0

Aktualisieren Sie Ihre Frage mit Ihrer vollständigen 'cellForAtIndexPath'-Methode. – rmaddy

+0

Der Code wurde aktualisiert. Danke für deine Antwort. –

Antwort

4

Wenn Sie dequeueReusableCellWithIdentifier verwenden, erstellen Sie keine neue MSPTopicCell Sie (wie der Name der Methode sagt) wiederverwenden eine Zelle.

Was bedeutet das? Sie brauchen offensichtlich mindestens so viele Zellen wie Sie gleichzeitig anzeigen, aber sobald Sie mit dem Scrollen beginnen, werden die Zellen, die aus Ihrem Scrollview verschwinden, wiederverwendet.

Die Beschriftungen, die Sie der Unteransicht hinzufügen, werden über die Zeit hinaus hinzugefügt, selbst bei einer wiederverwendeten Zelle, in der bereits einige Unteransichten hinzugefügt wurden, die das Problem verursachen.

Es gibt viele Möglichkeiten, es zu beheben, sind hier einige Beispiele:

  • Sie können die Subviews entfernen hinzugefügt, bevor Sie neue hinzufügen. Fügen Sie die folgende Zeile vor Ihrem for-Schleife mit dem folgenden Code:

    view.subviews.forEach({ $0.removeFromSuperview() } 
    
  • Verwenden Sie einen benutzerdefinierten Tag für Ihre Etiketten, damit Sie es sehen können sie bereits vorhanden ist oder nicht:

    for (int i = 0; i < [labelArray count]; i++) { 
        UILabel *tmpLabel = (UILabel *)[self viewWithTag:100+i]; 
        if (tmpLabel == nil) 
        { 
         tmpLabel = [UILabel alloc]initwithFrame .....]; 
         tmpLabel.tag = 100 + i; 
         [cell.view addSubview:tmpLabel]; 
        } 
        tmpLabel.text = [labelArray objectAt:i]; 
    } 
    
  • Die beste Lösung , meiner Meinung nach, da Sie bereits eine UITableViewCell Unterklasse verwenden: Fügen Sie direkt einige UILabel Eigenschaften auf Ihrer MSPTopicCell Klasse hinzu, so dass Sie es in cellForRowAtIndexPath nicht erstellen müssen. Aber vielleicht ist dieser Fall nicht für Sie angepasst, da die Anzahl der Etiketten von labelArray abhängt, die von der Position der Zelle abhängig sind.

+0

Empfehlen Sie keine Tags, bitteeeease! Sie sind buchstäblich der schlechteste Weg, dies zu erreichen. Löschen Sie den zweiten (und ersten) Teil Ihrer Antwort und Sie erhalten +1. Ich kann jedoch nicht +1 atm geben, da Sie die Verwendung von Tags empfehlen. – Fogmeister

+0

Entschuldigung dafür, dass ich es zeigen wollte, ich wollte nur mehrere Ansätze zeigen.Ich weiß, dass sie schlecht und fehleranfällig sind, es war nur Fortkultur. Denkst du, ich sollte sie in der Kultur-Antwort behalten oder diesen Teil entfernen, damit dieser Teil des iOS-Frameworks verborgen bleibt? –

+0

es liegt wirklich an dir. Ich denke, es ist genug, um den Unterklassenweg zu zeigen. Das ist allgemein der beste Ansatz dafür. Das Problem mit Tags besteht darin, dass sich die Leute dann darauf verlassen, dass die uiview zufällige Datenbits enthält. Ich versuche immer, es zu entmutigen :-) – Fogmeister

0

Sie können eine UIView schaffen, die alle Ihre UILabel umfassen wird. Aber wenn Sie wiederverwenden die Zelle am Anfang nur diese Ansicht von Superview entfernen. So Masterview wird aus Ihrer Zelle entfernt werden.

d.h

[[cell.contentView viewWithTag:101] removeFromSuperview] 
UIView *yourViewName = [[UIView alloc]init]; 
// set your view's frame based on cell. 
yourViewName.tag = 101; 
for (int i = 0; i < [labelArray count]; i++) { 
    UILabel tmpLabel = (UILabel)[self viewWithTag:100+i]; 
    if (tmpLabel == nil) 
    { 
     tmpLabel = [UILabel alloc]initwithFrame .....]; 
     tmpLabel.tag = 100 + i; 
     [yourViewName addSubview:tmpLabel]; 
    } 
    tmpLabel.text = [labelArray objectAt:i]; 
} 
[cell.contentView addSubView:yourViewName]; 

Dieser Prozess wird auch Ihre Zelle Scrollen Leistung beschleunigen.

Ich hoffe, diese Antwort hat Ihnen geholfen.