2013-02-15 5 views
5

Ich füge Elemente (z. B. Gestenerkenner, Unteransichten) zu Zellen in CellForRowIndexPath hinzu. Ich möchte diese nicht hinzufügen, wenn die Zelle wiederverwendet wird (vermutlich), also gibt es eine Möglichkeit, leicht zu sagen, ob die Zelle neu ist oder wiederverwendet wird?Wie kann ich feststellen, ob eine von dequeueReusableCellWithIdentifier zurückgegebene Zelle in iOS 6 wiederverwendet wird?

Der Zellprototyp ist in einem Storyboard definiert.

Ich verwende keine benutzerdefinierte Unterklasse für die Zelle (scheint wie Overkill). Ich verwende das Zell-Tag, um Untersichten zu identifizieren, also kann ich das nicht verwenden.

Ich könnte den Ansatz vor iOS 6 verwenden, aber es gibt sicherlich einen besseren Weg, etwas so einfach zu machen?

Ich konnte nichts online finden, so Angst, dass ich über etwas verwirrt sein könnte - aber es ist eine harte Sache zu suchen.

+1

Sie sind nicht verwirrt, es bringt das Muster ein wenig durcheinander. – jrturton

+0

@ jrturton. Vielen Dank. Ich begann mich selbst zu zweifeln. – dommer

+2

Wenn Sie keine Dinge hinzufügen möchten, wenn die Zelle wiederverwendet wird, bedeutet das (denke ich), dass Sie das, was Sie hinzufügen, auf dynamische Weise nicht ändern. Warum also nicht diese Dinge in IB hinzufügen? ? – rdelmar

Antwort

7

Der einfachste Weg, dies zu bewältigen ist für die Existenz der Dinge, die Sie hinzufügen müssen zu überprüfen.

Nehmen wir an, Ihre Zelle muss eine Unteransicht mit dem Tag 42 haben, wenn sie nicht bereits vorhanden ist.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    UIView *subview = [cell viewWithTag:42]; 
    if (!subview) { 
     ... Set up the new cell 
    } 
    else { 
     ... Reuse the cell 
    } 
    return cell; 
} 
1

Es ist wahrscheinlich Overkill im Vergleich zur Verwendung des Ansatzes vor iOS6 (keine registrierte Klasse), aber wenn Sie wirklich dabei bleiben wollen, können Sie associated objects verwenden.

#import <objc/objc-runtime.h> 

static char cellCustomized; 

... 
-(UITableViewCell *)getCell 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:myCell]; 
    if(!objc_getAssociatedProperty(cell, &cellCustomized)) { 
     [self setupCell:cell]; 
     objc_setAssociatedProperty(cell, &cellCustomized, @YES, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 
    return cell; 
} 

... 

(nicht getestet)

Verwandte Themen