2013-02-15 8 views
5

Dodaję przedmioty (np. Rozpoznawanie gestów, subviews) do komórek w komórceForRowIndexPath. Nie chcę ich dodawać, jeśli komórka jest ponownie używana (prawdopodobnie), więc czy istnieje sposób łatwego określenia, czy komórka jest nowa, czy też jest ponownie używana?Jak określić, czy komórka zwrócona przez dequeueReusableCellWithIdentifier jest ponownie używana w systemie iOS 6?

Prototyp komórki jest zdefiniowany w scenorysie.

Nie używam niestandardowej podklasy dla komórki (wygląda na przesadę). Używam tagu komórki do identyfikowania subviews, więc nie mogę tego użyć.

Mogę użyć podejścia pre-iOS 6, ale z pewnością istnieje lepszy sposób na zrobienie czegoś tak prostego?

Nie mogłem znaleźć niczego w Internecie, więc obawiam się, że mogę być zakłopotany - ale szukanie tego jest trudne.

+1

Nie jesteś zdezorientowany, to trochę psuje wzór. – jrturton

+0

@jrturton. Dzięki. Zaczynałem wątpić w siebie. – dommer

+2

Jeśli nie chcesz dodawać rzeczy, jeśli komórka jest ponownie używana, oznacza to (myślę), że nie zmieniasz tego, co dodajesz w dynamiczny sposób, więc dlaczego nie dodać tych rzeczy w IB, aby zacząć od ? – rdelmar

Odpowiedz

7

Najprostszym sposobem rozwiązania tego problemu jest sprawdzenie istnienia rzeczy, które trzeba dodać.

Załóżmy, że twoja komórka musi mieć podgląd z tagiem 42, jeśli jeszcze go nie ma.

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

To prawdopodobnie przesada w porównaniu do korzystania z metody pre-iOS6 (bez zarejestrowanej klasy), ale jeśli naprawdę chcesz się z tym uporać, możesz użyć associated objects.

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

... 

(nie badane)

Powiązane problemy