2010-12-16 7 views
1

Ich habe eine einfache Zelle - entworfen in IB - und mit dem Wiederverwendungs-Identifizierungs-Set. Der folgende Code funktioniert ganz gut. Wie auch immer - die NSLog() zeigt, dass die Ergebnisse nie zwischengespeichert werden.dequeueReusableCellWithIdentifier: Bezeichner, der keine loadNibNamed-Zelle aufnimmt

Table View-Controller-Klasse:

- (UITableViewCell *)tableView:(UITableView *)tableView 
      cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    switch/case for various cell types 
    { 
     Foo * item = [results objectAtIndex:indexPath.row]; 
     return [MyCell tableView:tableView populatedCellWith:item]; 
    } 
} 

MyCell Klasse ..

+(UITableViewCell *)tableView:(UITableView *)tableView populatedCellWith:(Foo *)item 
{ 
    static NSString * identifier = @"XXX"; 

    MyCell *cell = (MyCell *) [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) { 
     NSArray * items = [[NSBundle mainBundle] loadNibNamed:@"MyCell" 
           owner:self options:nil]; 
     cell = [items objectAtIndex:0]; 

     assert(cell && [cell.reuseIdentifier isEqualToString:identifier]); 

     NSLog(@"That was a load - rather than a nice cache for %@", self.class); 
    } 
    fill out some stuff. 
    return cell; 

}

Warum ist dies - wie es die Dinge viel effizienter macht?

Danke,

Dw.

+0

So sind die NSLog mehr Sie verwenden sehen als einmal? Ich versuche nur, deine Frage zu klären. –

+0

Ja, tatsächlich - und sie wurden mit einer Zellenkennung eingerichtet (was das 'assert' überprüft). –

Antwort

0

Die Art und Weise, wie Sie die Tabellenansichtszelle erstellen, kann nicht sicherstellen, dass die Zelle in die wiederverwendbare Warteschlange in der Tabellenansicht eingefügt wird. Nur Weise zu tun, ist

initWithStyle:reuseIdentifier: 

Initializes a table cell with a style and a reuse identifier and returns it to the caller. 

Meine andere question

0

Sind Sie sicher, dass die Zellen mit einer Zellenkennung versehen wurden? UITableView speichert diese nicht ohne.

+0

Es muss in der Xib gesetzt werden, sonst würde das 'assert' fehlschlagen? – deanWombourne

+0

Richtig - das bestätigt der Assert tatsächlich als gesetzt. Etwas Dummes zu tun (wie man einen Zeigervergleich annimmt), und chainging, um den Identifiziererzeiger anstelle des Zeichenkettenwertes beim nächsten Mal aufzuheben (z. B. mit einem Identifizierer = cell.reuseIndentifier), hilft nicht. –

+0

Hoppla, ich hatte die Assert-Zeile verpasst, sorry. 'UITV' kann aus verschiedenen Gründen wählen, nicht zwischenzuspeichern, aber in der Regel werden sie auf fehlende Wiederverwendungsidentifizierer reduziert oder haben einfach nicht genug Zellen (dh nicht genug Zeilen, um Caching zu benötigen). Wenn nichts zutrifft, bin ich ratlos. – millenomi

Verwandte Themen