Der wichtigste Unterschied besteht darin, dass die forIndexPath:
Version bestätigt (abstürzt), wenn Sie keine Klasse oder Feder für den Bezeichner registriert haben. Die ältere (Nicht- forIndexPath:
) Version wird nil
in diesem Fall zurückgegeben.
Sie registrieren eine Klasse für einen Bezeichner, indem Sie sie registerClass:forCellReuseIdentifier:
an die Tabellenansicht senden . Sie registrieren eine Schreibfeder für eine Kennung, indem Sie sie registerNib:forCellReuseIdentifier:
an die Tabellenansicht senden .
Wenn Sie Ihre Tabellenansicht und Ihre Zellenprototypen in einem Storyboard erstellen, übernimmt der Storyboard-Loader die Registrierung der im Storyboard definierten Zellprototypen.
In Sitzung 200 - Was ist neu in Cocoa Touch von WWDC 2012forIndexPath:
? Wird die (damals neue) Version ab ca. 8:30 Uhr besprochen. Es heißt, dass "Sie immer eine initialisierte Zelle erhalten" (ohne zu erwähnen, dass sie abstürzt, wenn Sie keine Klasse oder Feder registriert haben).
Das Video sagt auch, dass "es die richtige Größe für diesen Indexpfad haben wird". Vermutlich bedeutet dies, dass die Größe der Zelle vor der Rückgabe festgelegt wird, indem die eigene Breite der Tabellenansicht überprüft und die tableView:heightForRowAtIndexPath:
Methode Ihres Delegaten aufgerufen wird (falls definiert). Aus diesem Grund benötigt es den Indexpfad.
dequeueReusableCellWithIdentifier:forIndexPath:
gibt immer eine Zelle zurück. Es verwendet entweder vorhandene Zellen erneut oder erstellt eine neue und kehrt zurück, wenn keine Zellen vorhanden sind.Während das traditionelle
dequeueReusableCellWithIdentifier:
System eine Zelle zurückgibt, wenn es existiert, dh wenn es eine Zelle gibt, die wiederverwendet werden kann, gibt es zurück, dass es sonst null zurückgibt. Sie müssten also eine Bedingung schreiben, um auch dennil
Wert zu überprüfen .Um Ihre Frage zu beantworten, verwenden
dequeueReusableCellWithIdentifier:
Sie, wenn Sie iOS 5 und niedrigere Versionen unterstützen möchten, da diesdequeueReusableCellWithIdentifier:forIndexPath
nur unter iOS 6+ verfügbar istReferenz: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :
quelle
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Ich habe nie verstanden, warum Apple die neuere Methode dequeueReusableCellWithIdentifier: forIndexPath: erstellt hat. Ihre Dokumentation ist nicht vollständig und etwas irreführend. Der einzige Unterschied, den ich zwischen den beiden Methoden feststellen konnte, besteht darin, dass diese ältere Methode null zurückgeben kann, wenn sie keine Zelle mit dem übergebenen Bezeichner findet, während die neuere Methode abstürzt, wenn sie nicht zurückkehren kann eine Zelle. Beide Methoden geben garantiert eine Zelle zurück, wenn Sie den Bezeichner richtig eingestellt haben, und erstellen die Zelle in einem Storyboard. Beide Methoden geben garantiert auch eine Zelle zurück, wenn Sie eine Klasse oder xib registrieren und Ihre Zelle in Code oder einer xib-Datei erstellen.
quelle
tableView.estimateHeight
, wird auch die Größe der Zelle richtig bestimmt. Ich bekomme immer noch nicht den Vorteil der neuen Methode.Kurzum:
Hollemans M. 2016, Kapitel 2 Checkliste, IOS Apprentice (5. Ausgabe). S. 156.
quelle
Ich würde empfehlen, beide zu verwenden, wenn Sie dynamisch generierten Inhalt verwenden. Andernfalls kann Ihre App unerwartet abstürzen. Sie können Ihre eigene Funktion implementieren, um eine optionale wiederverwendbare Zelle abzurufen. Wenn dies der Fall ist
nil
, sollten Sie eine leere Zelle zurückgeben, die nicht sichtbar ist:Swift 3
Und die Erweiterung, um eine leere Zelle zurückzugeben:
Ein vollständiges Beispiel für die Verwendung:
quelle