2013-05-05 14 views
19

Ich benutze eine benutzerdefinierte UITableViewCell in meinem UITableView, aber das Problem ist, dass die Zelle nie Null ist, wenn Sie die dequeueReusableCellWithIdentifier aufrufen. Warum ist das ?dequeueReusableCellWithIdentifier gibt nie Null

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UINib *nib = [UINib nibWithNibName:@"PHResultTableViewCell" bundle: nil]; 
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    PHResultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 
    if (cell == nil) 
    { 
     PackageHolidayItem *obj=[[PackageHolidayItem alloc]init]; 
     obj= [totalArray objectAtIndex:indexPath.row]; 
     cell.packageHolidayItem = obj; 
     [cell loadRow]; 

    } 
    return cell; 
}  
+1

verwenden Sie Storyboards? –

+0

Auch wenn Sie keine nib registriert haben und dequeueReusableCellWithIdentifier könnte nil zurückgeben, wäre die Konfiguration der Zelle nur im Fall 'if (cell == nil) {...} 'falsch. –

Antwort

0

Ich glaube nicht, dass es Null zurückgeben soll. Warum willst du es?

Die Methode dequeueReusableCellWithIdentifier gibt eine Zelle zurück, die gerade angezeigt werden soll. Es ist also gut, dass sie nicht null ist - so können Sie sie nach Bedarf ändern.

14

Es gibt keine Null zurück, weil Sie eine Schreibfeder für die Wiederverwendung von Zellen registriert haben ([[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];).

Wenn dequeueReusableCellWithIdentifier: keine Zelle in der Wiederverwendungswarteschlange tableviews finden kann, instanziiert sie eine neue aus der von Ihnen angegebenen Nib.

+0

Vielleicht, aber er registrierte die Feder tatsächlich in 'viewDidLoad', und registrierte Nibs haben Vorrang vor Prototyp-Zellen. Und die Spitze kann nicht Null sein, sonst hätte er den Zellenprototyp überschrieben, und die Ausreißer würden keine Zelle zurückgeben. Ich nehme an, intern ist die Prototyp-Zelle auf die gleiche Weise wie die registrierte Nib gespeichert. Fazit: Der eigentliche Aufruf von 'registerNib: forCellReuseIdentifier:' bewirkt, dass die Warteschlange eine Zelle zurückgibt, aber es könnte auch eine Prototyp-Zelle geben. Die einzige Möglichkeit, dies herauszufinden, ist das Entfernen des Aufrufs 'registerNib ::'. Nichts für ungut, ich bin nitpicking :-) –

+0

Während ich die erschöpfende Antwort zu schätzen, als ich auf das Original Codebeispiel blickte, bemerkte ich ganz einfach nicht seine Registrierung der NIB (was lustig ist, weil ich seine gereinigt Quellcode). Ich reagierte ausschließlich auf seine Frage nach "aus der Warteschlange ..." und "zurückkehrend". Wie wir wissen, passiert dies sowohl bei der Registrierung einer NIB als auch bei der Verwendung von Zellprototypen. Aber du hast recht, da er eine NIB in seinem Codebeispiel registriert, die dazu führt, dass man "aus der Warteschlange" ausschleust und "niemals" zurückkehrt. – Rob

2

Da andere darauf hingewiesen haben, wenn Sie eine Nib registriert haben, um eine tableViewCell wiederzuverwenden, erhalten Sie garantiert eine Instanz der Zelle. Wenn Sie einen Wert für die Zelle festlegen möchten. Sie können versuchen, Ihren Code wie dieser

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     PHResultTableViewCell *cell = (PHResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCell" 
                           forIndexPath:indexPath];]; 

     cell.packageHolidayItem = totalArray[indexPath.row];; 
     [cell loadRow]; 

     return cell; 
    }  
+0

Ja, ich verwende Storyboards –

+0

@TrineHaalsMadsen Überprüfen Sie, ob der im Storyboard angegebene cellIdentifier korrekt ist. Und ich habe meine Antwort aktualisiert. – Anupdas

22

Modifizieren Ab iOS 5, wenn Sie Storyboards und Ihre Wiederverwendung Bezeichner verwenden, entspricht einem Prototyp in Ihrem Storyboard Sie nicht eine Null aus dequeueReusableCellWithIdentifier zurückgegeben.

von Apple Doc:

Tabellenansicht Programmierhandbuch für iOS

Erstellen und Konfigurieren Wenn eine Tabellenansicht

einer dynamischen Tabellenansicht mit Daten

Bestücken Die dequeueReusableCellWithIdentifier: Methode fragt nach einer Zelle , das in einem Storyboard definiert ist, gibt die Methode immer eine gültige Zelle zurück. Wenn keine wiederverwendbare Zelle darauf wartet, wiederverwendet zu werden, erstellt die Methode mithilfe der Informationen im Storyboard selbst eine neue Zelle. Dieser beseitigt die Notwendigkeit, den Rückgabewert für Null zu überprüfen und eine Zelle manuell zu erstellen.

Sie können die Zellenadresse einzuloggen, um sich selbst zu beweisen, dass sie wiederverwendet werden. Aber nicht mit dem Logging liefern, wird es wirklich Ihren Tisch verlangsamen.

NSLog(@"Deque Cell %p", cell); 

Besser noch Breakpoint verwenden, um es zu protokollieren.

enter image description here

$25 = 0x097f9850 <DDSImageSubtitleCheckedTableViewCell: 0x97f9850; baseClass = UITableViewCell; frame = (0 22; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x97f9740>> 
$26 = 0x0a6a4a00 <DDSImageSubtitleCheckedTableViewCell: 0xa6a4a00; baseClass = UITableViewCell; frame = (0 66; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa6a4b50>> 
$27 = 0x0a3ad250 <DDSImageSubtitleCheckedTableViewCell: 0xa3ad250; baseClass = UITableViewCell; frame = (0 110; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ad390>> 
$28 = 0x0a3ae640 <DDSImageSubtitleCheckedTableViewCell: 0xa3ae640; baseClass = UITableViewCell; frame = (0 176; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ae780>> 
$29 = 0x0972a370 <DDSImageSubtitleCheckedTableViewCell: 0x972a370; baseClass = UITableViewCell; frame = (0 220; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x972a340>> 

Wenn Sie nur die Adressen

enter image description here

0x097f9850 
0x0a6a4a00 
0x0a3ad250 
0x0a3ae640 
0x0972a370 
+0

Die Screenshot-Einstellungen für zwei Breakpoints scheinen identisch zu sein, erhalten jedoch unterschiedliche Ausgaben. Hatten sie im Bereich "Debugger Command" unterschiedliche Inhalte? – pix

+0

@pix gutes Auge. Danke für das Abfangen des Tippfehlers, es hätte 'p-Zelle' sein sollen, nicht 'po-Zelle' p ist primitiver Druck, wo po Druckobjekt ist und [Zellbeschreibung] aufruft. Ich habe das Bild gehackt. Danke noch einmal. – GayleDDS

+0

Ein guter Hack auch! Sieht fast so aus, als hättest du den Screenshot neu erstellt –

Verwandte Themen