2013-02-01 9 views
9

Wann genau wird layoutSubviews auf eine benutzerdefinierte UITableViewCell in einer UITableViewCellscellForRowAtIndexPath Methode aufgerufen werden? Unten, ich brauche layoutSubviews nach dem ich die Eigenschaft FiltersTableViewCellItem gesetzt habe aufgerufen werden. Habe ich das richtig eingerichtet? Ich würde gerne layoutSubviews verwenden können, weil ich gehört habe, dass es besser für die Leistung ist.Wann genau wird layoutSubviews für benutzerdefinierte UITableViewCell aufgerufen?

- (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 hat nichts mit Leistungsverbesserungen zu tun. Tatsächlich hat es den gleichen Effekt wie Autorelease. –

Antwort

13

layoutSubviews wird irgendwann nach tableView:willDisplayCell: genannt, die nach tableView:cellForRowAtIndexPath: genannt wird. Sie können dies überprüfen, indem Sie Haltepunkte in den relevanten Methoden setzen und die Reihenfolge sehen, in der sie getroffen werden. Setzen Sie beispielsweise einen Haltepunkt am Ende von tableView:cellForRowAtIndexPath:. Dann fügen Sie die folgende Methode FiltersTableViewCell

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

und einen Haltepunkt setzen dort. Dann starte die App und schau was passiert.

+4

Aber, auch wenn 'layoutSubviews' nach' willDisplayCell' aufgerufen wird, bedeutet das nicht, dass das Layout aus Gründen der Selbstkalibrierung bestanden hat. Ich finde, dass eine selbstbemessende Zelle, die nicht gefüllt ist, bis "willDisplayCell" nicht die richtige Höhe erhält, auch wenn sie auch einen Layout-Durchlauf erzwingt, indem sie 'layoutIfNeeded' aufruft. Ich musste meinen Code so ändern, dass er in 'cellForRowAtIndexPath' aufzufüllen war, damit die automatische Größenanpassung funktioniert. –

-1

Wie in dieser answer erwähnt, gibt es viele Fälle, in denen es aufgerufen wird. Ich würde auch sagen, dass es aufgerufen werden könnte, wenn ein wiederverwendbares Element aus der Warteschlange für wiederverwendbare Zellen aus der Warteschlange genommen wird. Versuchen Sie, das FiltersTableViewCellItem festzulegen, bevor Sie nach wiederverwendbaren Elementen suchen.

1

Versuchen Sie, setNeedsLayout aufzurufen, nachdem Sie Ihren Artikel festgelegt haben.

filtersTableViewCell.filtersTableViewCellItem = filtersTableViewCellItem; 
[filtersTableViewCell setNeedsLayout]; 
Verwandte Themen