2016-04-28 11 views
0

Ich erstelle UITableViewCell wie folgt. In diesem Bildschirm könnte ich 1 Quiz, 2 Quiz, usw. und 1 Umfrage, 2 Umfragen usw. haben. Es wird dynamisch sein.iOS Hinzufügen dynamischer Unteransicht in uitableviewcell

Als Ergebnis, wenn Benutzer scrollen nach oben und unten, basierend auf Daten auf meinem cell erhalten, entferne ich vorherige UIViews und immer wieder neu erstellen. (Ich weiß, es ist super schlecht. Jetzt ist mein Scrollen bekam Ausgabe.)

enter image description here

NSArray *quizzez = self.cellData[SERVER_QUIZZES]; 
    NSArray *polls = self.cellData[SERVER_POLLS]; 
    NSMutableArray *combinedQuizPoll = [NSMutableArray array]; 
    [combinedQuizPoll addObjectsFromArray:quizzez]; 
    [combinedQuizPoll addObjectsFromArray:polls]; 

    for (UIView *vw in self.quizPollViewCollection) { 
     [vw removeFromSuperview]; 
    } 

    for (NSDictionary *quizPollDict in combinedQuizPoll) 
    {    
     QuizPollSubView *vwQuizPoll = [QuizPollSubView loadFromNibWithType:QuizPollSubViewNoViewRelated andNavType:self.navType]; 
     [vwQuizPoll setW:CGRectGetWidth(self.frame)]; 
     [vwQuizPoll setDelegate:self]; 
     [vwQuizPoll setData:muQuizPollDict]; 
     [vwQuizPoll setX:0 andY:offset]; 
     [self.contentView addSubview:vwQuizPoll]; 
     offset = CGRectGetMaxY(vwQuizPoll.frame) + 4; 
     [self.quizPollViewCollection addObject:vwQuizPoll]; 
    } 

Wie soll ich zur Verbesserung der Leistung zu machen? Ich habe andere ähnliche Frage in StackOverflow auch studiert.

How to make a UITableViewCell with different subviews reusable?

1) Ich brauche dynamisches Quiz, Umfrage Ansicht (Anzahl der Quiz haben, Umfrage für jede Zelle anders sein)

2) Wie kann ich auf jene Ansicht verweisen, die ich geschaffen?

+0

Vielleicht kann helfen: http://stackoverflow.com/questions/ 5746904/how-to-make-a-uitableviewcell-mit-verschiedenen-subviews-wiederverwendbar? Lq = 1 –

Antwort

0

Vor allem muss ich sagen, dass Ihr Ansatz, die gleiche Zelle zu verwenden, um Dinge in eine vertikale zu versetzen, nicht die beste ist. Für diese Art von Situation sollten Sie mehr als eine Zelle verwenden. Etwas wie:

  • ...
  • DecriptionCell
  • QuizCell
  • QuizCell
  • PollCell
  • PollCell
  • PollCell
  • ...

Trotzdem werde ich Ihnen eine Lösung vorschlagen, die Ihnen helfen könnte, ohne die Struktur Ihres UITableView zu ändern.

Eigentlich hatte ich das gleiche Problem vor ein paar Wochen, und ich fand eine sehr gute Lösung dafür.

Grundsätzlich ist das Hauptkonzept, UITableViewCell wiederzuverwenden, Sie sollten Ansichten in der Konfiguration der Zelle nicht hinzufügen oder entfernen, da die Leistung beeinträchtigt wird.

Also, die Lösung, die ich verwendet habe, war, verwenden Sie unterschiedliche Wiederverwendung Identifikator für jede Art von Konfiguration, die die Zelle haben kann.

Die einzige Anforderung ist, keine Nib-Datei für die Zelle zu haben.

Wenn ich richtig verstanden habe, kann Ihre Zelle Dynamik Quiz und Umfragen haben. Lassen Sie uns sagen, dass maximal 10 Quiz und maximal 10 Umfragen möglich sind. Obwohl ich zusehe, dass beide die gleiche Ansicht haben, QuizPollSubView. Nehmen wir also maximal 20 Untersichten pro Zelle.

So in dem Verfahren, in dem Sie die Zellen registrieren ich tun würde, die nächste:

Class myClass = [CustomTableViewCell class]; 
NSString *classID = NSStringFromClass(myClass); 
for (NSUInteger index = 0; index < 20; index++) { 
    NSString *identifier = [classID stringByAppendingString:[@(index) stringValue]]; 
    [self.tableView registerClass:myClass forCellReuseIdentifier:identifier]; 
} 

Dann in der CellForRow müssen Sie die Zelle mit dem properIdentifier dequeue, zum Beispiel:

NSString *cellID = NSStringFromClass([CustomTableViewCell class]); 
NSUInteger numberOfQuizsAndPolls = 3 + 2; //This is 3 quizs and 2 polls, I gess that you can read from the DataModel 
NSString *identifier = [cellID stringByAppendingString:[@(numberOfQuizsAndPolls) stringValue]]; 
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath]; 

//then configure the cell 

Als Nächstes in initWithStyle: reuseIdentifier: Sie sollten die Unterviews mit leerem Wert erstellen und die Informationen aus dem Bezeichner

NSString *stringNumber = [reuseIdentifier stringByReplacingOccurrencesOfString:NSStringFromClass([self class]) 
                     withString:@""]; 
NSUInteger numberOfSubviews = [stringNumber integerValue]; 

//here you should add all of your QuizPollSubView with emtpy content. 
for (NSUInteger index = 0; index < numberOfSubviews; index++) { 
    QuizPollSubView *vwQuizPoll = [QuizPollSubView loadFromNibWithType:QuizPollSubViewNoViewRelated andNavType:self.navType]; 
    [vwQuizPoll setW:CGRectGetWidth(self.frame)]; 
    [vwQuizPoll setDelegate:self]; 
    //[vwQuizPoll setData:muQuizPollDict]; YOU CAN NOT SET THE DATA HERE BECAUSE YOU DONT HAVE IT 
    [vwQuizPoll setX:0 andY:offset]; 
    [self.contentView addSubview:vwQuizPoll]; 
    offset = CGRectGetMaxY(vwQuizPoll.frame) + 4; 
    [self.quizPollViewCollection addObject:vwQuizPoll]; 
} 
0 extrahieren

Schließlich müssen Sie die richtigen Informationen in der Konfiguration der Zelle festlegen. Etwas wie:

- (void)configureWithQuizPollDict:(NSDictionary *)combinedQuizPoll 
{ 
    for (NSDictionary *quizPollDict in combinedQuizPoll) 
    { 
     //get the proper index in the quizPollViewCollection. 
     QuizPollSubView *vwQuizPoll = self.quizPollViewCollection[index]; 
     [vwQuizPoll setData:muQuizPollDict]; 
    } 
} 

Ich hoffe, dass es Ihnen hilft !!

Dank

PD: Wenn Sie eine Zelle mit Nib verwenden möchten wahrscheinlich müssen wir die UITableView Unterklasse benutzerdefinierte Sie dequeue hinzufügen

Verwandte Themen