Ich lese eine benutzerdefinierte Tabellenzelle in tableView:cellForRowAtIndexPath:
aus einer Nib-Datei. Das funktioniert gut für meine Zwecke, außer es ist ziemlich langsam.
Nun, ich weiß, dass es auf lange Sicht richtig ist, die Zelle vollständig im Code zu erstellen und eine einzelne Ansicht zu verwenden, und so weiter. Aber das ist ein Prototyp, und ich möchte nicht so viel Mühe darauf verwenden.
Im Moment würde ich mich freuen, wenn ich die Feder nur einmal in der Unterklasse UIViewController
lesen würde, dann würde tableView:cellForRowAtIndexPath:
Kopien davon machen. Meine Annahme hier ist, dass das Kopieren schneller wäre als das Lesen der Feder.
Hier ist, was ich benutze, um die Feder zu laden, die ich von viewDidLoad:
(und retain
nach)
Alles ist soweit gut. Aber die Frage ist: Wie kopiere ich das immer wieder? Ist es überhaupt möglich?
Ich habe [_cachedObject copy]
und [_cachedObject mutableCopy]
versucht, aber UITableViewCell
unterstützt kein Kopierprotokoll.
Wenn ich muss, kann ich ihnen einfach sagen, dass sie die Geschwindigkeit ignorieren sollen, bis ich bereit bin, die Feder komplett zu entfernen, aber ich würde es lieber etwas schneller machen, wenn hier eine tief hängenden Frucht ist.
Irgendwelche Ideen?
Verwenden Sie das in der Tabellenansicht integrierte Zellklonen. Apple wusste, dass das Generieren vieler Tabellenzellen langsam war. Überprüfen Sie die Dokumentation für diese Methode:
%Vor%Sie erstellen die Zelle einmal. Wenn neue Zellen angefordert werden, verwenden Sie diese Methode, um die vorhandenen Zellen zu klonen. Dann ändern Sie einfach, was an der neuen Zelle geändert werden muss, und geben das Zellobjekt zurück.
Sehen Sie sich auch den von Apple zur Verfügung gestellten Beispielcode für die Tabellenansicht an, der diese Methode verwendet und Ihnen den richtigen Weg zeigt. Die Tatsache, dass Ihre Zelle aus einer Feder geladen wurde, sollte überhaupt keine Rolle spielen.
Geringfügige Klarstellung: Ich denke nicht, dass die oben genannte Methode Zellen für Sie klont. Stattdessen werden Zellenobjekte, die vom Bildschirm gescrollt wurden, einfach an einen neuen Ort verschoben. Also wird eine Zelle buchstäblich wiederverwendet. Stellen Sie also sicher, dass Ihre benutzerdefinierte Tabellenansicht auf alle neuen Werte außerhalb der Initialisierung eingestellt werden kann.
Ich denke, dass das Verarbeiten der Tabellenzelle zusammen mit dem Ausreißmechanismus verwendet werden kann, was es erlaubt, die Zelle einmal zu erstellen (von der Spitze oder programmatisch oder automatisch von anderer Spitze geladen und verlinkt als eine Steckdose in IB) und dann zu klonen oder es bei Bedarf herausnehmen.
UITableViewCell entspricht nicht dem NSCopying-Protokoll, aber es unterstützt den Mechanismus der Schlüsselarchivierung / -freigabe, sodass es zum Klonen verwendet werden kann.
Basierend auf der Antwort " Wie du eine UIButton in Objective C duplizieren kannst? > "Meine Delegatenmethode für Datenquellen sieht folgendermaßen aus:
%Vor%Und in meinem Fall ist self.tableViewCell eine Zelle, die einmal aus der nib-Datei der Ansicht geladen wurde.
Ich habe nicht getestet, was schneller sein wird: "archive + unarchive" klonen oder "nib file + unarchive laden", welches Framework im Falle von -LoadNibNamed: owner: options: Ich habe diese Methode nur aus Gründen der Bequemlichkeit verwendet, aber gute Chancen, dass der Speichervorgang im Vergleich zur Dateioperation schneller wird.
EDIT: Es scheint nicht so einfach wie es zuerst schien. Da UIImage NSCoding nicht entspricht, können Zellen mit konfigurierten UIImageViews nicht einfach ohne zusätzlichen Code kopiert werden. Ja, das ganze Bild zu kopieren ist definitiv keine gute Übung, applaudiert Apple, dies zu zeigen.
Nicht stolz auf diese Lösung, aber es funktioniert mit der maximalen Anzahl von möglichen IB-Bindungen:
Interface (AlbumTableViewCell ist eine Unterklasse von UITableViewCell, von der eine Instanz in der XIB-Datei von AlbumViewController definiert ist):
%Vor%Implementierung (unarchive / archive macht eine Kopie / klont die Tabellenansichtszelle):
%Vor%Nun, ich bin nicht sicher, warum alle Tutorials da draußen diesen Schritt nicht spezifizieren.
Wenn Sie Ihre eigene benutzerdefinierte UITableViewCell von Nib verwenden, ist das Aufrufen von dequeueReusableCellWithIdentifier nicht ausreichend. Sie müssen den "Identifier" in der IB angeben, nur dafür in der Registerkarte Tabellenansicht Zelle.
Stellen Sie dann sicher, dass der Bezeichner, den Sie in IB eingeben, mit dem Bezeichner identisch ist, den Sie für den dequeueReusableCellWithIdentifier verwenden.
Tags und Links objective-c iphone uitableview ios cocoa-touch