2013-02-01 11 views
9

Kiedy dokładnie można uzyskać wywołanie layoutSubviews na niestandardowej metodzie UITableViewCell w metodzie cellForRowAtIndexPath? Poniżej potrzebuję layoutSubviews nazywać się PO ustawieniu właściwości FiltersTableViewCellItem. Czy mam poprawnie skonfigurowany ten zestaw? Chciałbym móc używać layoutSubviews, ponieważ słyszałem, że jest to lepsze z punktu widzenia wydajności.Kiedy dokładnie robi layoutSubviews wywoływane dla niestandardowego UITableViewCell?

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"FiltersTableViewCell"; 
    FiltersTableViewCell *filtersTableViewCell = [[self dequeueReusableCellWithIdentifier:cellIdentifier] retain]; 
    FiltersTableViewCellItem *filtersTableViewCellItem = [[self.filtersTableViewCellItems objectAtIndex:[indexPath row]] retain]; 

    if (!filtersTableViewCell) 
    { 
     filtersTableViewCell = [[FiltersTableViewCell alloc] initWithFiltersTableViewCellItem:filtersTableViewCellItem]; 
     filtersTableViewCell.delegate = self; 
    } 
    else 
    { 
     filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
    } 
    return [filtersTableViewCell autorelease]; 
} 
+0

@Danny Lin ARC nie ma nic wspólnego z poprawą wydajności. W rzeczywistości ma ten sam efekt co autoreasada. –

Odpowiedz

13

layoutSubviews jest wywoływana w pewnym momencie po tableView:willDisplayCell:, która jest wywoływana po tableView:cellForRowAtIndexPath:. Możesz to sprawdzić, ustawiając punkty przerwania w odpowiednich metodach i obserwując kolejność, w jakiej zostaną uderzone. Na przykład ustaw punkt przerwania na końcu tableView:cellForRowAtIndexPath:. Następnie dodaj następującą metodę FiltersTableViewCell

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
} 

i ustawić tam punkt przerwania. Następnie uruchom aplikację i zobacz, co się stanie.

+4

Należy jednak zauważyć, że nawet jeśli 'layoutSubviews' jest wywoływane po' willDisplayCell', nie oznacza to, że jest to zrobione po przejściu layoutu w celu dokonania samo-rozmiaru. Zauważyłem, że komórka samokonwersyjna, która nie jest wypełniana, dopóki 'willDisplayCell' nie osiągnie odpowiedniej wysokości, nawet jeśli wymusi również przejście layoutu przez wywołanie' layoutIfNeeded'. Musiałem zmienić kod, by zapełnił się w 'cellForRowAtIndexPath' zamiast tego, żeby samokopiarka działała. –

-1

Jak wspomniano w tym answer, istnieje wiele przypadków, w których będzie ona tzw. Powiedziałbym również, że można go wywołać, gdy element wielokrotnego użytku jest usuwany z kolejki komórek do ponownego użycia. Spróbuj ustawić filtr FiltersTableViewCellItem przed wyszukiwaniem elementów do ponownego użycia.

1

Spróbuj wywołać setNeedsLayout po ustawieniu przedmiotu.

filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
[filtersTableViewCell setNeedsLayout]; 
Powiązane problemy